为什么在此处调用析构函数以及在调用该对象析构函数后如何调用对象成员函数?

Yanshof

我不明白为什么调用析构函数(下面代码中这个调用的位置)

如果调用了析构函数,为什么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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么调用从对象移出的析构函数?

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

返回的结构调用它自己的析构函数,该析构函数销毁分配的对象

在函数调用期间析构对象

std::map 对象析构函数被调用?

析构函数调用

为什么要调用析构函数

为什么不调用析构函数?

为什么分配操作完成后调用对象的析构函数

C ++为什么在堆栈中构造完对象后立即调用析构函数?

对象超出范围后不调用析构函数

为什么在“返回 0”后调用析构函数?

什么时候调用constinit对象的析构函数?

使用Vector创建对象时如何调用析构函数

如何阻止析构函数在堆栈分配的对象上被调用?

为什么在调用luaL_error时未调用C ++对象析构函数?

为对象分配值时为什么调用构造函数和析构函数

如何从析构函数调用const成员函数

为什么析构函数比构造函数调用得更多?

为什么在Friend函数中调用析构函数

从析构函数调用BeginInvoke

调用对象的析构函数是否等效于对该对象调用delete?

为什么在声明指向对象的指针时不调用析构函数

为什么不按相反的顺序对对象数组调用析构函数?

为什么QSharedPointer <T> ::: create不完整对象的调用析构函数?

C ++如何自动调用析构函数?

如何指定析构函数调用的顺序?

C ++:析构函数在对象范围之外被调用?

调用类型嵌套在类内部的对象析构函数?