如何将unique_ptr与operator new一起使用

时间:2014-06-25 02:03:50

标签: c++ windows c++11 new-operator unique-ptr

我正在分配一块带有输入大小的临时内存,我想使用unique_ptr来跟踪正确的生命周期而不必明确担心自己释放它。这就是我想出的:

{
    std::unique_ptr<BYTE> sp;
    sp.reset(reinterpret_cast<BYTE*>(operator new (100)));
}

我必须使用BYTE,因为MSVC不会使用std::unique_ptr<void>进行编译。根据我的测试,newdelete运算符按预期调用。由于这是一种不常见的用法(即明确使用operator new),我想检查一下这没有什么问题?是否有任何替代方案可能更好/更清洁?

1 个答案:

答案 0 :(得分:7)

假设您要使用new[]动态分配数组,则必须对数组类型使用unique_ptr部分特化。否则,当unique_ptr超出范围时,delete将在数组上调用delete[],而不是std::unique_ptr<BYTE[]> sp(new BYTE[100]); ,这将是未定义的行为。使用此:

new

如果您使用的是VS2013,您甚至可以使用make_unique来避免拨打auto sp = make_unique<BYTE[]>(100);

make_unique

请注意,operator new版本将对数组进行零初始化,而第一个版本则不会。


如果你真的打算使用operator delete,那么你需要提供一个自定义删除器,它会调用std::unique_ptr<BYTE, void(*)(BYTE *)> sp(static_cast<BYTE *>(::operator new(100)), [](BYTE *p) { ::operator delete(p);} ); 来释放内存。

{{1}}