gpt4 book ai didi

c++ - 如何将删除器传递给 make_shared?

转载 作者:IT老高 更新时间:2023-10-28 12:31:58 24 4
gpt4 key购买 nike

从 C++11 开始,由于多种原因,开发人员倾向于将智能指针类用于动态生命周期对象。对于那些新的智能指针类、标准,甚至建议不要使用像 new 这样的运算符,而是建议使用 make_sharedmake_unique 来避免一些容易出错。

如果我们喜欢使用智能指针类,比如shared_ptr,我们可以构造一个,

shared_ptr<int> p(new int(12));

我们还想将自定义删除器传递给智能指针类,

shared_ptr<int> p(new int(12), deleter);

另一方面,如果我们喜欢使用 make_shared 来分配,例如。 int,而不是使用 newshared_ptr 构造函数,就像上面的第一个表达式,我们可以使用

auto ip = make_shared<int>(12);

但是,如果我们还想将自定义删除器传递给 make_shared,有没有正确的方法可以做到这一点?似乎编译器,至少 gcc 会给出错误,

auto ip = make_shared<int>(12, deleter);

最佳答案

正如其他人所说,make_shared 不能与自定义删除器一起使用。但我想解释一下原因。

存在自定义删除器是因为您以某种特殊方式分配了指针,因此您需要能够以相应的特殊方式释放它。好吧,make_sharednew 分配指针。用 new 分配的对象应该用 delete 解除分配。标准删除者尽职尽责。

简而言之,如果您可以接受默认的分配行为,那么您也可以接受默认的 deallocation 行为。如果你不能忍受默认的分配行为,你应该使用 allocate_shared ,它使用提供的分配器来分配和释放存储空间。

此外,make_shared 被允许(并且几乎肯定会)在同一分配中为 T 和 shared_ptr 的控制 block 分配内存。这是您的删除者无法真正了解或处理的事情。而 allocate_shared 能够处理它,因为您提供的分配器可以执行分配和释放任务。

关于c++ - 如何将删除器传递给 make_shared?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34243367/

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