我正在分配一块具有input大小的暂存内存,我想使用unique_ptr
来跟踪正确的生命周期,而不必明确地担心自己释放它。 这就是我想到的:
{ std::unique_ptr<BYTE> sp; sp.reset(reinterpret_cast<BYTE*>(operator new (100))); }
我不得不使用BYTE
因为MSVC不会用std::unique_ptr<void>
编译。 从我的testing中,按预期调用new
和delete
操作符。 由于这是一个不常见的用法(即明确使用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);} );