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>.根据我的测试,new和delete操作符按预期调用.由于这是一种不常见的用法(即operator new明确使用),我想检查一下这没有什么问题?是否有更好/更清洁的替代方案?
假设您要使用动态分配数组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)