c++调用析构函数

Where C++ calls destructors?

本文关键字:析构函数 调用 c++      更新时间:2023-10-16

假设MemberMyList是两个用户定义的类。在以下代码中:

void fillList(MyList &list1)
{
    Member m1("aaa");
    Member m2("bbb");
    list1.insert(m1);
    list1.insert(m2);   
}
void func1()
{
    MyList lst;
    fillList(lst);
    lst.printAll();
}
int main()
{
    func1();
    return 0;
}

c++在什么时候调用m1, m2lst的析构函数?

假设c++不会删除将再次使用的对象是否总是安全的?

c++在什么时候调用每个m1, m2和list的析构函数?

析构函数在作用域的末尾以与对象定义相反的顺序调用。在您的示例中,首先调用func1(),它定义lst,然后调用fillList(),它定义m1m2。接下来fillList()结束,所以现在调用m2m1析构函数(与声明顺序相反)。最后func1()结束,因此调用lst析构函数。

假设c++不会删除将再次使用的对象是否总是安全的?

我不太明白你的意思。被销毁的对象已经消失,您不能再使用它了。试图访问它(通过悬空指针/引用)只是未定义的行为。

析构函数在其作用域的末尾被调用(如果在'stack'上分配),或者当您手动调用它们的delete操作符(如果动态分配)时被调用。

关于你的另一个问题,肯定不能做任何这样的假设。c++很乐意让你用你喜欢的钝锯砍掉自己的腿。它可能会问你是否想要一些小猫形状的创可贴(你必须自己做),但仅此而已。