gpt4 book ai didi

C++11:如果对象是使用 make_shared 构造的,如何删除它

转载 作者:太空狗 更新时间:2023-10-29 20:04:37 25 4
gpt4 key购买 nike

我遗漏了一些关于共享/弱指针的信息:

当使用make_shared 构造shared_ptr 时,只使用一次内存分配(为控制 block 和对象本身分配内存)。当最后一个 shared_ptr 被销毁但还剩下 weak_ptr 时会发生什么?此时必须释放托管对象。但是,如果由 make_shared 分配的内存被释放,那会使弱指针无效,因为相同的释放会破坏控制 block 。

最佳答案

使用make_sharedallocate_shared,只有一个包含对象本身的引用控制 block 。它看起来像这样:

struct internal_memory_type
{
unsigned char[sizeof T] buf; // make sure the object is at the top for
// efficient dereferencing!
// book keeping data
} internal_memory;

对象是就地构建的:::new (internal_memory.buf) T(args...)

整个 block 的内存使用 ::operator new 分配,或者在 allocate_shared 的情况下使用分配器的 allocate() 函数。

当不再需要对象时,会调用对象本身的析构函数,类似于 internal_memory.buf->~T();。当不再需要引用控制 block 时,即当所有弱引用和所有强引用都消失时,引用控制 block 作为一个整体被释放 ::operator delete,或者allocate_shared 的分配器的 deallocate() 函数。

关于C++11:如果对象是使用 make_shared 构造的,如何删除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497659/

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