且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用std::UNIQUE_PTR的私有析构函数的单例

更新时间:2021-08-06 18:51:01

执行删除的不是unique_ptr本身,而是删除器。因此,如果您想使用friend方法,您必须这样做:

friend std::unique_ptr<SingletonFactory>::deleter_type;

但是,我认为不能保证默认删除程序不会将实际delete委托给另一个函数,这会破坏这一点。

相反,您可能希望提供自己的删除程序,可能如下所示:

class SingletonFactory {
    static std::unique_ptr<SingletonFactory, void (*)(SingletonFactory*)> volatile instance;

public:
    static SingletonFactory& getInstance();

private:
    SingletonFactory();

    SingletonFactory(
        const SingletonFactory& ingletonFactory
    );

    ~SingletonFactory();

    void deleter(SingletonFactory *d) { d->~SingletonFactory(); free(d); }
};

在创建函数中:

SingletonFactory* volatile tmp = (SingletonFactory*) malloc(sizeof(SingletonFactory));
new (tmp) SingletonFactory; // placement new
instance = decltype(instance)(tmp, &deleter);