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

标签 c++ c++11 unique-ptr

我有一个通用类 myClass有时需要根据用途存储额外的状态信息。这通常是通过 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;
};

最佳答案

可能更直观的存储额外信息的方法是使用带有虚拟析构函数的接口(interface) IAdditionalData。 无论您拥有什么数据结构,都将从 IAdditionalData 继承并存储在 std::unique_ptr<IAdditionalData> 中。 .

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

关于c++ - 将 std::unique_ptr<void> 与自定义删除器一起用作智能 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384748/

相关文章:

c++ - 令人惊讶的是, vector <char> 的自定义分配器效率低下

c++ - 指向 std::thread 的共享指针是一种不好的做法吗?

c++ - 在节点中使用原始指针,在树中使用 unique_ptr

c++ - 传递对 Variadic 模板的引用

c++ - CUDA 程序崩溃的驱动程序

c++ - 如何删除从基类继承的纯虚函数?

c++ - std::sort 对数组和索引列表进行排序?

c++ - std::unique_ptr::reset 检查托管指针是否为空?

c++ - C++ 中指向 unique_ptr 函数参数的原始指针的用途是什么?

c++ - QT 文件菜单未集成到标题栏中