gpt4 book ai didi

c++ - 如何将 unique_ptr 与 operator new 一起使用

转载 作者:可可西里 更新时间:2023-11-01 13:54:39 26 4
gpt4 key购买 nike

我正在分配一 block 具有输入大小的临时内存,我想使用 unique_ptr跟踪适当的生命周期,而不必明确担心自己释放它。这是我想出的:

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

我不得不使用 BYTE因为 MSVC 不会用 std::unique_ptr<void> 编译.根据我的测试,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);} );

关于c++ - 如何将 unique_ptr 与 operator new 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com