【问题标题】:Destructors and the delete() method in C++C++ 中的析构函数和 delete() 方法
【发布时间】:2017-02-06 07:09:44
【问题描述】:

所以我在 C++ 中为一个类添加了一个析构函数。

class object { ~object() };

并用新方法声明了一个对象,从而在堆上分配它

object *pointer = new object;

我还需要使用吗

delete(object); 

程序结束时的方法? (析构函数不是已经对此负责了吗?)

【问题讨论】:

  • 是的,在这种情况下,您仍然需要调用delete 才能调用析构函数并释放内存。
  • 或std::unique_ptr<object> pointer(new object()); 并停止让裸指针拥有资源。
  • 而且,作为新的,删除不需要括号..
  • 大多数时候,你不需要首先使用指针和new。
  • 析构函数负责销毁对象。它不负责决定对象何时被销毁。这两个概念有很大的不同。

标签: c++ heap-memory destructor


【解决方案1】:

您仍然必须致电delete(object)。析构函数负责如何删除一个对象,delete(object) 负责何时删除它。但在现代 C++ 中,裸指针的使用被认为是一种非常糟糕的做法。您应该考虑使用智能指针,例如 std::unique_ptr 来管理内存。

【讨论】:

  • 什么是“裸指针”?
【解决方案2】:

你有两种不同的记忆。 堆栈和堆。

当您超出范围时,堆栈上的所有内容都会自行删除(删除步骤之一是调用析构函数)

堆上的所有内容(您调用malloc、new 等)您必须自己显式删除(这将导致调用析构函数)。

像unique_ptr / shared_ptr 这样的智能指针是一种现代 c++ 方法,可以摆脱对堆对象的手动删除,并确保在不再需要对象时将其删除。

【讨论】:

    【解决方案3】:

    析构函数是自定义清理过程的一种方式(添加日志记录,根据三/五规则提供清理等)。还是需要delete,否则会出现内存泄漏。

    话虽如此,编写实际上需要news 和deletes(尤其是后者)的代码是不受欢迎的,并且被认为是一种不好的做法。如果需要在堆上存储对象,请使用unique_ptr/shared_ptr 或vector 之类的容器。

    如果您有时间,我建议您观看 Herb Sutter 在 C++Con 2016 上的演讲:Leak-Freedom in C++ 以获得指导。

    【讨论】:

      【解决方案4】:

      当对象的生命周期结束时,析构函数被调用。对于堆分配的对象,这意味着当您删除它们时。 所以打电话给

      delete(object);
      

      调用你的析构函数并释放分配的内存。

      【讨论】:

        【解决方案5】:

        是的,你必须需要Delete 方法。

        Default destructors 调用成员 objects 的析构函数,但 NOT 删除 指向对象的指针。因此,您需要编写显式调用 delete 的析构函数。喜欢,

        delete pointer;
        

        【讨论】:

          【解决方案6】:

          我还需要在程序结束时使用delete(object); 方法吗?

          是的。

          析构函数不是已经对此负责了吗?

          没有。

          你的delete ptr; 是调用那个析构函数的东西。如果你没有声明一个析构函数,就会为你声明一个析构函数,所以这没什么区别。

          当您的对象具有自动存储持续时间时,您无需编写 delete ptr;(非常松散地说:“当您没有使用 new 创建它时”),因为这样就为您完成了等效操作。

          但在这两种情况下都会调用析构函数。

          【讨论】:

            【解决方案7】:

            一个 new 和一个 delete 表达式(不是 new 和 delete 运算符)正在调用两个调用:

            新:

            1) call the operator new for memory allocation
            2) invoke the appropriate constructor
            

            删除:

            1) invoke the destructor
            2) call the operator delete for memory deallocation
            

            因此,您必须将任何新的与删除配对,以避免资源(内存)泄漏。 但是对象的构造和销毁不需要new和delete。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-02
              • 2017-12-22
              • 2011-06-11
              • 1970-01-01
              • 2023-03-27
              • 2016-09-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多