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

标签 c++ c++11 shared-ptr reference-counting weak-ptr

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

当使用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/

相关文章:

c++ - 关于shared_ptr、scoped_ptr和shared_array的一些问题

c++ - Qt Creator/C++ 在这种情况下 valgrind 是否有意义

c++ - Xcode 7 和 openCV(无 Swift): Core. hpp header 必须编译为 C++

c++ - g++-查找合适的Windows库进行链接,以便编译FANN库

c++ - for 循环可以在其语句中进行赋值吗?

c++ - boost::shared_ptr 问题。为什么这行得通?

c++ - 如何以模板化方式获取二元函数的幂等值?

c++ - 错误 C2248 : 'std::promise<_Ty>::promise' : cannot access private member declared in class 'std::promise<_Ty>'

c++ - 如何将字符串添加到 vector (并随后显示它)?

C++ 入门 5 版 : count reference and underlying pointers