【发布时间】:2019-12-12 03:35:20
【问题描述】:
我编写了以下代码来查看 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 共享指针是如何做到这一点的?
【问题讨论】:
-
我可以想象复制时保留了
shared_ptr的原始删除器。 -
@πάνταῥεῖ 显然,删除器永远不会存储在任何共享 ptr 实例中(无论是
std::shared_ptr还是任何“拥有”具有共享功能的智能 ptr);它是动态分配的。
标签: c++ shared-ptr void