何时使用:class析构函数或删除运算符

时间:2014-07-21 16:08:30

标签: c++ class destructor delete-operator

我想知道类析构函数与删除类对象之间的区别是什么。对他来说,他们看起来像他们做同样的事情,那么你如何选择使用哪一个?

例如,我正在编写一个程序,我需要删除我创建的一些类对象。我有一些像VectorClass *v_temp1 = new VectorClass(v1, size);这样的类构造函数,在函数的最后我只使用delete v_temp1调用删除了它们。它运行得很好,对象被删除了,为什么我只能这样做就可以解决创建析构函数的问题?

2 个答案:

答案 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