【问题标题】:When to use: class destructor or delete operator何时使用:类析构函数或删除运算符
【发布时间】:2014-09-12 05:26:17
【问题描述】:

我想知道类析构函数和直接删除类对象之间有什么区别。在我看来,它们看起来就像在做同样的事情,那么您如何选择使用哪一个呢?

例如,我正在开发一个需要删除我创建的一些类对象的程序。我有一些像VectorClass *v_temp1 = new VectorClass(v1, size); 这样的类构造函数,在函数结束时,我只使用delete v_temp1 调用将它们删除。它工作得很好,并且对象正在被删除,那么当我可以简单地做到这一点时,为什么我还要麻烦创建一个析构函数呢?

【问题讨论】:

  • delete 也会释放内存。
  • 析构函数不会释放该对象的内存。他们只是破坏对象。如果您使用 RAII,通常不需要析构函数。比您的示例更简单的是 VectorClass v_temp1(v1, size);,之后您无需清理。
  • delete 运算符用于破坏使用new() 获得的动态分配的实例。永远不要直接调用类的析构函数。
  • 嗯,这很有道理。谢谢你们,我希望我可以点击评论上的答案检查哈哈!
  • 你不选择。如果你是新的,你必须删除它。如果 VectorClass 包含一些新的东西,并且您没有在其析构函数(或其他地方)中删除它们,那么即使您删除了 VectorClass,也会泄漏内存。

标签: c++ class destructor delete-operator


【解决方案1】:

类的析构函数负责清理它可能分配的所有资源。

delete 操作符负责销毁动态分配的对象。也就是说,您应该 delete 使用 new 创建的任何内容。销毁类类型对象的过程会先调用其析构函数,然后释放对象。

因此,每当类类型对象被销毁时,都会调用析构函数。一个对象可能会以多种方式被销毁,其中一种是使用delete

我们更喜欢自动分配,因为它比动态分配更安全。自动分配的对象在超出范围时会自动销毁(当然,这将调用其析构函数)。在你的情况下,我会写:

VectorClass v_temp1(v1, size);

这个对象不需要是deleted,但它肯定会被销毁并调用它的析构函数。

【讨论】:

    【解决方案2】:

    只要一个对象不再存在,就会自动调用类析构函数。所以你不能“选择是否使用它”——析构函数调用是用语言构建的。 (从技术上讲,您可以有时需要手动调用析构函数,但在正常情况下不需要)。您不需要提供析构函数 - 但如果您想在类的对象被销毁时执行一些代码,析构函数是正确的地方。

    当您不再需要使用new 运算符创建的对象时,需要手动使用运算符delete。运算符delete 调用析构函数,然后释放new 分配的内存。

    如果在 C++ 中 - 例如在 Java 中 - new 是创建对象的唯一方法,delete 和析构函数之间的区别将是技术性的。但是在 C++ 中你可以通过其他方式创建对象,最重要的是 - 在堆栈上。建议在堆栈上创建对象。在你的例子中

    VectorClass *v_temp1 = new VectorClass(v1, size);
    

    您没有使用推荐的方式。你应该使用

    VectorClass v_temp1(v1, size);
    

    那么析构函数会在块的末尾自动调用,没有必要(甚至不可能)使用delete

    【讨论】:

    • 我明白了,我来自 java,所以我在创建对象时使用“new”只是惯例。您回答的彻底性非常有帮助!
    猜你喜欢
    • 2014-03-13
    • 2016-07-11
    • 1970-01-01
    • 2015-10-19
    • 2017-04-04
    • 2011-06-29
    • 2015-12-31
    • 2018-09-09
    相关资源
    最近更新 更多