如何正确释放类成员?

时间:2017-12-13 18:49:47

标签: c++ operator-overloading user-defined-functions class-members

我应该使用public static IEnumerable<int> ArrayDiff(int[] a, int[] b) 重载或delete函数或其他东西来释放类成员吗?

del()

3 个答案:

答案 0 :(得分:6)

你正在寻找一个析构函数:

class Field
{
private:
    size_t* square = new size_t[5];
public:
    ~Field() { delete [] square; }
};

但是学习Rule of Zero并转而使用资源管理类:

class Field
{
private:
    std::unique_ptr<size_t[]> square;
public:
    Field() : square(new size_t[5]) { }
};

具有移动语义的好处已经做了正确的事情,复制语义已经被禁用,而析构函数已经在管理你的资源。

答案 1 :(得分:2)

  

我应该使用delete overload或del()函数还是其他东西来解除分配类成员?

都不是。

添加析构函数并确保删除析构函数中的内存。

class Field
{
  private:
    size_t* square = new size_t[5];
  public:
    ~Field() { delete [] square; }
};

在此时,请结帐Rule of Three并遵循规则。

答案 2 :(得分:1)

首先:不要覆盖删除操作符;这很少有意义。必要时,“清理”依赖对象是在析构函数中完成的。

所以你要写

class Field {
   ...
   virtual ~Field() { delete[] square; }
   ...
}

请注意,删除字段(显式或隐式)将触发析构函数。

其次,仅对您之前使用delete创建的对象调用new。不要像使用Field f; delete &f一样删除具有自动存储持续时间的对象。

第三,如果自动存储持续时间也是一个选项,则避免使用new分配对象。所以如果你写了:

,你就克服了完整的问题
class Field
{
private:
    size_t square[5];
};

int main() {
    Field f;
}