我正在分配一块带有输入大小的临时内存,我想使用unique_ptr
来跟踪正确的生命周期而不必明确担心自己释放它。这就是我想出的:
{
std::unique_ptr<BYTE> sp;
sp.reset(reinterpret_cast<BYTE*>(operator new (100)));
}
我必须使用BYTE
,因为MSVC不会使用std::unique_ptr<void>
进行编译。根据我的测试,new
和delete
运算符按预期调用。由于这是一种不常见的用法(即明确使用operator new
),我想检查一下这没有什么问题?是否有任何替代方案可能更好/更清洁?
答案 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}}