我不明白为什么调用析构函数(下面代码中这个调用的位置)
如果调用了析构函数,为什么Print()
可以调用该函数?
编码:
class Entity
{
public:
Entity()
{
std::cout << "Ctor Call" << std::endl;
}
~Entity()
{
std::cout << "Destroy Call" << std::endl;
}
void Print()
{
std::cout << "Print me" << std::endl;
}
};
int main()
{
Entity* ent;
{
std::shared_ptr<Entity>sharedPtr = std::make_shared<Entity>();
sharedPtr->Print();
ent = &(*sharedPtr);
} //after this line the destructor was call
ent->Print(); // the print is success
std::cin.get();
}
是的,当共享指针超出范围(因此被销毁)时,会调用析构函数。后续Print()
方法调用成功的原因是,在被破坏的对象上调用方法是未定义的行为,因此它不一定会崩溃。对象本身可能仍然存在并且方法调用可能会成功,尽管绝对不能保证。在这种情况下,机会甚至更高一些,因为该方法实际上并不使用来自实例的任何数据,而只是调用库函数。
请注意,这里复制 shared_ptr 持有的底层地址并不会增加其内部引用计数,因为这样做是为了规避从共享指针获取副本的“官方”方法,实际上是从std:: shared_ptr 参考:
shared_ptr
对象只能通过复制它们的值来共享所有权:如果两个对象shared_ptr
是从同一个(非shared_ptr
)指针构造(或制造)的,它们都将拥有该指针而不共享它,当其中一个释放它(删除)时会导致潜在的访问问题它的托管对象)并将另一个指向无效位置。
如果副本是通过复制 获得的shared_ptr
,则该对象不会被删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句