ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-25 13:09:20  阅读:704  来源: 互联网

标签:reference-counting weak-ptr c c11 shared-ptr


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

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

解决方法:

使用make_shared和allocate_shared,只有一个包含对象本身的参考控制块.它看起来像这样:

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 …).

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

当不再需要该对象时,会在对象本身上调用析构函数,例如internal_memory.buf-> ~T();.当不再需要引用控制块时,即当所有弱引用都消失以及所有弱引用时,引用控制块作为一个整体被释放:: operator delete,或者使用allocator的deallocate()函数allocate_shared.

标签:reference-counting,weak-ptr,c,c11,shared-ptr
来源: https://codeday.me/bug/20190725/1533302.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有