【发布时间】:2015-10-22 00:58:40
【问题描述】:
我想知道释放分配给shared_ptr和weak_ptr共享的内部控制块的内存的确切条件是什么。
我猜控制块包含一个 shared_ptr 计数器和一个weak_ptr 计数器。
#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;
}
- 使用虚拟分配内存构建 shared_ptr。控制块被分配,它的 Dummy 指针被设置为“dummy”
- 从 shared_ptr 构建一个weak_ptr。两个智能指针共享相同的控制块地址。
- 共享指针被破坏。调用虚拟 dtor(“dtor”打印在“Land mark”之前)。控制块在程序结束前仍然存在。
我对这些 cmets 的看法是否正确?
在这些步骤中,控制块内会发生什么(详细)?
编辑:make_shared case 会发生什么?
有一个分配包含虚拟对象和控制块。
这是否涉及放置新以使用两个不同的对象?
或者它是一个包含原始对象的结构?
#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;
}
}
【问题讨论】:
标签: c++ c++11 shared-ptr weak-ptr