如何将unique_ptr与operator new一起使用

lan*_*ery 4 c++ windows new-operator unique-ptr c++11

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

{
    std::unique_ptr<BYTE> sp;
    sp.reset(reinterpret_cast<BYTE*>(operator new (100)));
}
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*ian 7

假设您要使用动态分配数组new[],则必须unique_ptr对数组类型使用部分特化.否则,一个unique_ptr将调用delete数组,而不是delete[]当它超出范围时,这将是未定义的行为.用这个:

std::unique_ptr<BYTE[]> sp(new BYTE[100]);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是VS2013,您甚至可以new通过使用来避免呼叫make_unique.

auto sp = make_unique<BYTE[]>(100);
Run Code Online (Sandbox Code Playgroud)

请注意,该make_unique版本将对数组进行零初始化,而第一个版本则不会.


如果你真的打算使用operator new,那么你需要提供一个自定义删除器来调用operator delete以释放内存.

std::unique_ptr<BYTE, void(*)(BYTE *)> sp(static_cast<BYTE *>(::operator new(100)),
                                          [](BYTE *p) { ::operator delete(p);} );
Run Code Online (Sandbox Code Playgroud)

  • @lancery如果是内置类型,`new []`和`operator new`之间没有区别.我确实看到你在说什么,但是做出区分并不值得努力,恕我直言.只需将`operator new`方法的详细程度与`make_unique`进行比较.另外,在我的最后一条评论中,我应该说,在你使用`operator new`分配的内存上调用`delete`而不是`operator delete`是不明确的行为. (2认同)