我想知道类析构函数与删除类对象之间的区别是什么。对他来说,他们看起来像他们做同样的事情,那么你如何选择使用哪一个?
例如,我正在编写一个程序,我需要删除我创建的一些类对象。我有一些像VectorClass *v_temp1 = new VectorClass(v1, size);
这样的类构造函数,在函数的最后我只使用delete v_temp1
调用删除了它们。它运行得很好,对象被删除了,为什么我只能这样做就可以解决创建析构函数的问题?
答案 0 :(得分:2)
类的析构函数负责清理它可能已分配的任何资源。
delete
运算符负责销毁动态分配的对象。也就是说,您应该delete
使用new
创建的任何内容。销毁类类型对象的过程将首先调用其析构函数,然后释放该对象。
因此,只要销毁类类型对象,就会调用析构函数。对象可能以各种方式被破坏,其中一个使用delete
。
我们更喜欢自动分配,因为它比动态分配更安全。当一个自动分配的对象超出范围时会被自动销毁(当然,它会调用它的析构函数)。在你的情况下,我会写:
VectorClass v_temp1(v1, size);
此对象不需要delete
d,但它肯定会被销毁并且它的析构函数将被调用。
答案 1 :(得分:2)
只要对象不再存在,就会自动调用类析构函数。所以你不能选择是否使用它 - 析构函数调用是用语言构建的。 (从技术上讲,您可以并且有时需要手动调用析构函数,但在正常情况下不需要)。您不需要提供析构函数 - 但是如果您希望在类的对象被销毁时执行某些代码,则析构函数是正确的位置。
当您不再需要使用delete
运算符创建的对象时,需要手动使用运算符new
。运算符delete
调用析构函数,然后释放由new
分配的内存。
如果在C ++中 - 例如在Java中 - new
是创建对象的唯一方法,delete
和析构函数之间的区别是技术性的。但是在C ++中,您可以通过其他方式创建对象,最重要的是 - 在堆栈上。建议在堆栈上创建对象。在你的例子中
VectorClass *v_temp1 = new VectorClass(v1, size);
您没有使用推荐的方式。你应该使用
VectorClass v_temp1(v1, size);
然后在块结束时自动调用析构函数,并且不需要(甚至可能)使用delete
。