首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能指针控制块内部机械

智能指针控制块内部机械
EN

Stack Overflow用户
提问于 2015-07-30 15:15:40
回答 2查看 3.5K关注 0票数 4

我想知道释放分配给shared_ptr和weak_ptr共享的内部控制块的内存的确切条件是什么。

我猜控制块包含一个shared_ptr计数器和一个weak_ptr计数器。

代码语言:javascript
复制
#include <memory>
#include <iostream>

struct Dummy
{
    Dummy() { std::cout << "ctor" << std::endl; }
    ~Dummy() { std::cout << "dtor" << std::endl; }
};

int main()
{
    auto dummy = new Dummy();
    auto wp = std::weak_ptr<Dummy>(); // pointing to nothing

    {
        auto sp = std::shared_ptr<Dummy>(dummy); // 1
        wp = sp; // 2
    } // 3
    std::cout << "Land mark" << std::endl;
}
  1. 构建具有虚拟分配内存的shared_ptr。控制块被分配,它的虚拟指针被设置为“虚拟”
  2. 从weak_ptr构建一个shared_ptr。两个智能指针共享控制块的相同地址。
  3. 共享指针被销毁。dtor被称为“dtor”("dtor“在"Land mark”之前)。控制块仍然存在,直到程序结束。

这些评论我说得对吗?

在这些步骤中,控制块内会发生什么(详细信息)?

编辑: make_shared案例会发生什么?

有一个分配包含虚拟对象和控制块。

这是否涉及使用两种不同的视图的新位置?

还是包含原始对象的结构?

代码语言:javascript
复制
#include <memory>
#include <iostream>

struct Dummy
{
    Dummy() { std::cout << "ctor" << std::endl; }
    ~Dummy() { std::cout << "dtor" << std::endl; }
};

int main()
{
    auto wp = std::weak_ptr<Dummy>(); // pointing to nothing
    {
        auto sp = std::make_shared<Dummy>();
        wp = sp;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-30 15:25:23

这就是valgrind为您的测试显示的内容(如果您不习惯val差制),这是按时间分配的内存量,首先是指向对象,然后是计数管理器,然后是指针对象被取消分配。

这基本上就是它的工作方式,当最后一个shared_ptr超出范围时,指向对象被删除(它的内存被取消),但是计数管理器仍然在那里,因为weak_ptr需要知道发生了什么,如果有指向对象是否有指向对象。

但是,有时情况并非如此,如果使用make_sharedmake_shared实际上只对对象和计数管理器使用一个分配,在本例中,分配的内存将停留在那里,直到最后一个weak_ptr超出范围。

票数 6
EN

Stack Overflow用户

发布于 2015-07-30 15:22:59

是的,你是对的。

发生情况的详细情况:

  1. 控件块被创建并绑定到share_ptrshared_count = 1weak_count = 0.
  2. weak_pointer绑定到控制块。shared_count = 1weak_count = 1.
  3. 最后一个(只有) shared_pointer死掉了,摧毁了这个对象。控制块由weak_ptr维护。shared_count = 0weak_count = 1.
  4. (main()__的结尾)最后一个(只有) weak_ptr死了,shared_count = 0。没有人被绑定到控制块,所以最后一个weak_ptr破坏了控制块。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31727669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档