作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我写了下面的代码来看看 shared_ptr<void>
当它是对 shared_ptr<Thing>
的最后一次引用时会运行并且本身就被摧毁了。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
struct Thing{
~Thing(){
cout<<"Destroyed\n";
}
int data;
};
int main(){
{
shared_ptr<void> voidPtr;
{
shared_ptr<Thing> thingPtr = make_shared<Thing>();
voidPtr = thingPtr;
}
cout<<"thingPtr is dead\n";
}
cout<<"voidPtr is dead\n";
return 0;
}
哪些输出:
thingPtr is dead
Destroyed
voidPtr is dead
它的行为方式我喜欢,但这完全出乎意料,我想了解这里发生了什么。最初的共享指针不再存在,它只是一个 shared_ptr<void>
到底。所以我希望这个共享指针的行为就像它持有 void*
并且不知道Thing::~Thing()
,但它调用它。这是设计使然,对吧? void 共享指针是如何做到这一点的?
最佳答案
由共享指针共同拥有的共享状态还包含一个删除器,一个类似于对象的函数,它在托管对象的生命周期结束时提供给它以释放它。我们甚至可以使用 appropriate constructor 指定我们自己的删除器。 .删除器的存储方式以及它所经历的任何类型删除都是实现细节。但只要说共享状态包含一个知道如何释放所拥有资源的函数就足够了。
现在,当我们用 make_shared<Thing>()
创建一个具体类型的对象时并且不提供删除器,共享状态设置为保存一些可以释放 Thing
的默认删除器.该实现可以仅从模板参数生成一个。而且由于它作为共享状态的一部分存储,它不依赖于类型 T
任何shared_pointer<T>
这可能是共享国家所有权。它总是知道如何释放 Thing
.
所以即使我们制作 voidPtr
唯一剩下的指针,删除器保持不变,仍然知道如何释放 Thing
.当 voidPtr
超出范围。
关于c++ - shared_ptr<void> 如何知道使用哪个析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57344571/
我是一名优秀的程序员,十分优秀!