gpt4 book ai didi

c++ - shared_ptr 如何知道使用哪个析构函数?

转载 作者:IT老高 更新时间:2023-10-28 12:39:32 24 4
gpt4 key购买 nike

我写了下面的代码来看看 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com