作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在分配一 block 具有输入大小的临时内存,我想使用 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
),我想检查一下这没有什么问题吗?是否有更好/更清洁的替代品?
最佳答案
假设您想使用 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);} );
关于c++ - 如何将 unique_ptr 与 operator new 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399086/
我是一名优秀的程序员,十分优秀!