将std :: unique_ptr <void>与自定义删除器一起用作智能空白*

ste*_*164 10 c++ unique-ptr c++11

我有一个泛型类myClass,有时需要根据用途存储额外的状态信息.这通常用a完成void*,但我想知道我是否可以使用一个,std::unique_ptr<void, void(*)(void*)>以便在类实例被破坏时自动释放内存.问题是我需要使用自定义删除器,因为删除void*会导致未定义的行为.

有没有办法默认构造一个std::unique_ptr<void, void(*)(void*)>,所以我没有先用虚拟删除器构造它,然后在我使用void*状态结构时设置一个真正的删除器?或者是否有更好的方法将状态信息存储在类中?

以下是一些示例代码:

void dummy_deleter(void*) { }

class myClass
{
public:
    myClass() : m_extraData(nullptr, &dummy_deleter) { }
    // Other functions and members
private:
    std::unique_ptr<void, void(*)(void*)> m_extraData;
};
Run Code Online (Sandbox Code Playgroud)

Ed *_*rbu 6

存储额外信息的更直观的方法可能是使用带有虚拟析构函数的接口IAdditionalData.您可能拥有的任何数据结构都将从IAdditionalData继承并存储在std::unique_ptr<IAdditionalData>.

这也提供了更多的类型安全性,就像在IAdditionalData和实际类型之间进行静态转换一样,而不是在两者之间的reinterpret_cast void *和任何数据类型.

  • @ steve9164:有两个相关的东西可以导致UB:`unique_ptr <Base>`其中`Base`没有虚拟析构函数,`unique_ptr <Base,void(*)(void*)>`where删除器转换为"派生*".后者是UB,因为转换序列`Derived* - > Base* - > void* - > Derived*`不一定会产生有效的`Derived*`指针.我认为可以通过删除转换`void*` - >`Base*` - >`Derived*`来保存它. (2认同)