如何在operator new中使用unique_ptr

我正在分配一块具有input大小的暂存内存,我想使用unique_ptr来跟踪正确的生命周期,而不必明确地担心自己释放它。 这就是我想到的:

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

我不得不使用BYTE因为MSVC不会用std::unique_ptr<void>编译。 从我的testing中,按预期调用newdelete操作符。 由于这是一个不常见的用法(即明确使用operator new ),所以我想检查一下这个没有问题? 而且是否有其他可能更好/更清洁的替代品?

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

 std::unique_ptr<BYTE[]> sp(new BYTE[100]); 

如果你使用的是VS2013,你甚至可以通过使用make_unique来避免对new的调用。

 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);} );