C ++调用析构函数的地方?

时间:2015-05-31 06:04:37

标签: c++ class memory-management destructor

假设MyListvoid 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; } 是两个用户定义的类。在以下代码中:

m1

C ++在何时调用每个m2lstecho '<script type="text/javascript"> alert("Sorry, there is no download available for this product! Please contact support."); window.close(); </script>'; exit; 的析构函数?

假设C ++没有删除将再次使用的对象是否总是安全的?

2 个答案:

答案 0 :(得分:2)

  

C ++在哪一点上调用每个m1,m2和lst的析构函数?

在作用域定义的相反顺序中,在作用域的末尾调用析构函数。在您的情况下,首先调用try { Console.WriteLine("The number of lines you want to calculate up to"); int loops = Convert.ToInt16(Console.ReadLine()); if (loops < 0) { Console.WriteLine("Can not enter a value less then zero... Try Again?"); Console.ReadLine(); goto Start; } Console.WriteLine("What multiplication tables would you like to do ?"); int m = Convert.ToInt16(Console.ReadLine()); for (int i = 1; i <= loops; i++) { Console.WriteLine(i * m); } } catch { Console.WriteLine("Enter numbers only"); Console.ReadLine(); goto Start; } ,其定义func1(),然后调用lst,其定义fillList()m1。接下来m2结束,所以现在fillList()然后调用m2析构函数(与它们的声明相反)。最后m1结束,因此调用func1()析构函数。

  

假设C ++没有删除将再次使用的对象总是安全的吗?

我真的不明白你的意思。被破坏的物体消失了,你不能再使用它了。试图访问它(通过悬空指针/引用)只是未定义的行为。

答案 1 :(得分:1)

在范围的末尾调用析构函数(如果在“堆栈”上分配)或手动调用其delete运算符(如果动态分配)。

关于你的另一个问题,绝对是安全地承担任何类似的事情。 C ++很乐意让你用你喜欢的钝锯切断自己的腿。它可能会问你是否想要一些小猫形状的绷带(你必须自己做),但这就是它。