如何正确解除分配 class 成员?

How to correctly deallocate class member?

我应该使用 delete 重载或 del() 函数或其他东西来释放 class 成员吗?

class Field
{
private:
    size_t* square = new size_t[5];
public:
    void del()
    {
        delete[] square;
    }
    void operator delete (void* p)
    {
        delete[] reinterpret_cast<Field*>(p)->square;
    }
};
int main()
{
    Field f;

    delete &f; 
    //or
    f.del();
}

Should I use delete overload or del() function or something else to deallocate class member?

都没有。

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

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

同时检查 Rule of Three 并遵守规则。

您正在寻找析构函数:

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

但学习 Rule of Zero 并转而遵从资源管理 class:

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

它的好处是移动语义已经在做正确的事情,复制语义已经被禁用,析构函数已经在管理您的资源。

第一:不要覆盖删除运算符;这很少有道理。 "Cleaning" up 依赖对象,如果需要,在析构函数中完成。

所以你会写

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

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

其次,仅对您之前使用 new 创建的对象调用 delete。不要像使用 Field f; delete &f.

那样删除具有自动存储持续时间的对象

第三,如果自动存储期限也是一个选项,请避免使用 new 分配对象。因此,如果您写道:

,您就可以解决整个问题:
class Field
{
private:
    size_t square[5];
};

int main() {
    Field f;
}