【问题标题】:How to properly deallocate variables in deconstructor如何在解构器中正确释放变量
【发布时间】:2018-02-17 04:07:07
【问题描述】:

假设我要创建一个具有这种结构的类

 class A
 {
     int a;
     B* b;
 }

我读到释放解构器中使用的变量是件好事。

~A
{
   delete b;
}

但是对于 int、double、原始类型的变量,我该怎么办?最好的方法或好的编程规则是什么?

【问题讨论】:

  • “解除分配原始类型”是什么意思?为什么你认为你需要对它做任何事情?
  • 您可以使用smart pointers 而不是手动管理内存。
  • 我推荐你关注the rule of zero,这样你就不用手动管理内存了。
  • 至于你的问题,你deletenewdelete[]new[]。就是这样。在您的示例中,不需要对 A::a 进行任何操作,因为您没有为它显式分配内存。
  • 作为非静态类成员的内置类型(intdouble 等)的一般规则是析构函数无需执行任何操作即可释放它们。它们是对象本身的一部分,在对象存在时开始存在,并随着对象不再存在。只有显式管理的资源(例如使用运算符new 初始化的指针)需要释放(例如使用运算符delete)。而且,顺便说一句,C++ 中没有解构器这样的东西。

标签: c++


【解决方案1】:

您不需要删除基本类型。

但不仅限于基本类型。对于您没有使用new 分配的任何内容,您不必调用delete。即使是指针。

【讨论】:

    【解决方案2】:

    c++ 中,每个new 都应该有一个delete

    new 被调用时,你在堆上分配并且你负责释放它。如果没有使用new,则内存在堆栈上分配,并将在进入我们的范围时被释放。

    请阅读thisthis。有很多关于这个主题的信息。

    【讨论】:

      【解决方案3】:

      我假设 B 是另一个类。您刚刚声明了指针。但还没有实例化。您还没有为该指针分配任何内存。因此将其初始化为 null。

       B* b = NULL;
      

      现在在解构器中删除它之前检查你是否分配了任何内存。

      if(b){delete b; b = NULL;}
      

      在上面的代码中,如果你分配了任何内存,那么只有它会被释放。 例如:如果你这样做了

      *b = new b
      

      现在为这个特定的指针分配了一些内存。所以它会正确释放。 除非您为指针分配一些内存,否则您不需要解除分配。 希望这会帮助你。

      【讨论】:

      • 你不需要if (b),你也不太可能需要b = NULL
      【解决方案4】:

      您可以在堆上分配基元类型(新...),但通常这无用。

      一般规则是您可以将 new 用于任何类型(int、double 或您自己的类型),并且您必须为每个分配的变量发出 delete堆上新的。


      但是,当您寻求最佳实践时,您应该阅读有关智能指针的文章或教程(std::shared_ptrstd::unique_ptr),它们可以帮助您在使用堆分配对象时避免错误。您也可以搜索关于lifetime和借阅的文章。

      最后,如果您想知道编写良好且安全的 C++ 的推荐做法是什么,您绝对应该阅读 isocpp 指南:http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines。它们用简单的语言描述了您应该做什么或不应该做什么,为什么以及如何做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多