2013-03-13 73 views
9

我有一个通用类myClass有时需要存储额外的状态信息,具体取决于用途。这通常使用void*完成,但我想知道是否可以使用std::unique_ptr<void, void(*)(void*)>,以便在类实例被破坏时自动释放内存。问题是,我需要使用自定义删除程序来删除void *,导致未定义的行为。使用std :: unique_ptr <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; 
}; 
+7

当我们有模板时,'void'指针确实没有多大用处。 – 2013-03-13 12:04:11

+3

这听起来像是[xy问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Pubby 2013-03-13 12:06:37

+0

您确定要在这里使用'unique_ptr',而不是'shared_ptr'吗? – 2013-03-13 12:12:43

回答

6

可能存储额外的信息,将有一个虚析构函数的接口IAdditionalData更直观的方式。 无论您可能拥有哪些数据结构,都会从IAdditionalData继承并存储在std::unique_ptr<IAdditionalData>中。

这也提供了更多的类型安全性,因为您将在IAdditionalData和实际类型之间进行静态转换,而不是在void *和任何数据类型之间reinterpret_cast。

+0

您也可以在void *和目标类型之间进行static_cast。 – 2013-03-13 12:12:24

+0

@ R.MartinhoFernandes您可以在void *和任何类型之间调用static_cast。它不提供类型安全保证。与界面相反。 – 2013-03-13 12:13:28

+0

从IAdditionalData到SomeDerivedAdditionalData的static_cast并没有比void *更安全的SomeDerivedAdditionalData,但(至少不是以任何重要的方式)。 – 2013-03-13 12:22:53

相关问题