【问题标题】:Do I need to clean up non-pointer data members?我需要清理非指针数据成员吗?
【发布时间】:2012-06-13 19:01:44
【问题描述】:

如果我不使用new 来分配类的数据成员,那么在析构函数中是否还需要进行任何清理?例如,在以下情况下,我需要delete 向量吗?还是依赖MyType

class A {
  A();
  ~A();
  MyType x;
  std::vector<MyType> v;
};
A::A() {
  x = MyType(42);
  v = std::vector<MyType>(5);
}
A::~A() {
  // what goes here?
}

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    为了迂腐,这取决于MyType 是什么。如果您有typedef char* MyType 并且为MyType 分配内存,并且您希望该内存归对象所有,那么是的,您需要一个析构函数。

    否则,您不需要为未使用newmalloc 分配的任何内容释放内存,所以不需要。

    你的类根本不应该有析构函数。有一个普遍的共识是你应该只在你真正需要的时候使用析构函数。拥有析构函数还意味着实现赋值运算符和复制构造函数(三法则)。如果您不管理任何内存,最好依赖编译器提供的内存 - 即编译器将生成如果您不管理这三个。

    此外,您的 构造函数 应如下所示:

    A::A() : x(42), v(5){
    }
    

    否则你的成员会被初始化然后分配到,这样很浪费。

    【讨论】:

    • 在这种特殊情况下,不需要 dtor。请记住,“RAII”中的“R”代表resource,而不是memory。有时您需要在 dtor 中释放内存以外的其他内容。
    • @JohnDibling 但这(至少第二部分)是基于资源在其特定所有者被销毁时释放的假设。所以如果MyType 获取资源并在其析构函数中释放它,就可以了。
    • 在这种情况下:一个对象应该管理一个资源,最大。如果您需要管理 2 个资源,请将它们包装在 2 个成员中,每个成员管理一个资源。
    【解决方案2】:

    您的类不需要显式析构函数。 vector 的析构函数无论如何都会被自动调用。而且由于矢量对象本身(与内部的数据相反)不是动态的,因此您不必delete 它。事实上,这是一个语法错误,因为v 不是指针。

    【讨论】:

    • 所以“三规则”在这种情况下不适用,因为我只需要一个显式构造函数?
    • 规则 3 是复制 ctor、dtor 和重载 =。不是其他演员的。
    • @djechlin:哦。这是有道理的。
    【解决方案3】:

    析构函数是自动调用的,所以你不需要这样做。此外,对于指针,请使用smart pointers(例如std::unique_ptr)而不是手动delete

    class A {
      A();
      ~A();
      MyType x;
      std::vector<MyType> v;
    };
    A::A() : x(42), v(5) { }
    A::~A() {
      // x.~MyType() implicitly called.
      // v.~std::vector<MyType>() implicitly called.
    }
    

    【讨论】:

      【解决方案4】:

      向量在销毁时自动删除。但是,如果您将指针存储在向量中,例如如果你说vector v;,你需要编写代码来删除向量中的指针。避免这种情况的一种方法是使用 vector<:unique_ptr>> 或 vector<:shared_ptr>>

      【讨论】:

        【解决方案5】:

        不,您不必这样做。它们的构造函数将被隐式调用。

        【讨论】:

          【解决方案6】:

          对于 A 类,不,你不需要,因为它没有使用 newmalloc 分配的任何指针成员。

          请注意,如果您的类/结构 MyType 有任何指针作为成员,则 MyType 的析构函数负责释放此类指针的内存,但您不需要'不必担心类A中的那个,因为当它的析构函数被调用时,向量的析构函数会调用MyType的析构函数。

          【讨论】:

          • 除非MyType是一个指针,在这种情况下不会调用析构函数并且你会泄漏内存。
          • @LuchianGrigore MyType 只能是 typedeffed 的指针,对吗?
          • @Andreas 或定义#define MyType X* :)
          猜你喜欢
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          相关资源
          最近更新 更多