C++在哪里调用析构函数?
Where C++ calls destructors?
假设Member
和MyList
是两个用户定义的类。在以下代码中:
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
、m2
和 lst
的析构函数?
假设 C++ 不会删除将再次使用的对象总是安全的吗?
At which point does C++ call destructor of each m1, m2 and lst?
析构函数在范围末尾以对象定义的相反顺序调用。在您的例子中,首先调用 func1()
,它定义了 lst
,然后调用 fillList()
,它定义了 m1
和 m2
。接下来 fillList()
结束,所以现在 m2
然后 m1
析构函数被调用(按照它们声明的相反顺序)。最后 func1()
结束,所以 lst
析构函数被调用。
Is it always safe to assume C++ does not remove an object which will be used again?
我不太明白你的意思。被破坏的对象消失了,你不能再使用它了。尝试访问它(通过悬空 pointer/reference)只是未定义的行为。
析构函数在其范围结束时被调用(如果在 'stack' 上分配)或当您手动调用它们的 delete
运算符时(如果动态分配)。
关于您的其他问题,绝对不 做出任何此类假设是安全的。 C++ 很乐意让你用一把钝锯锯断自己的腿。它可能会问你是否想要一些小猫形状的创可贴(你必须自己制作),但仅此而已。
假设Member
和MyList
是两个用户定义的类。在以下代码中:
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
、m2
和 lst
的析构函数?
假设 C++ 不会删除将再次使用的对象总是安全的吗?
At which point does C++ call destructor of each m1, m2 and lst?
析构函数在范围末尾以对象定义的相反顺序调用。在您的例子中,首先调用 func1()
,它定义了 lst
,然后调用 fillList()
,它定义了 m1
和 m2
。接下来 fillList()
结束,所以现在 m2
然后 m1
析构函数被调用(按照它们声明的相反顺序)。最后 func1()
结束,所以 lst
析构函数被调用。
Is it always safe to assume C++ does not remove an object which will be used again?
我不太明白你的意思。被破坏的对象消失了,你不能再使用它了。尝试访问它(通过悬空 pointer/reference)只是未定义的行为。
析构函数在其范围结束时被调用(如果在 'stack' 上分配)或当您手动调用它们的 delete
运算符时(如果动态分配)。
关于您的其他问题,绝对不 做出任何此类假设是安全的。 C++ 很乐意让你用一把钝锯锯断自己的腿。它可能会问你是否想要一些小猫形状的创可贴(你必须自己制作),但仅此而已。