如何正确释放类成员?

Posted

技术标签:

【中文标题】如何正确释放类成员?【英文标题】:How to correctly deallocate class member? 【发布时间】:2017-12-13 18:49:47 【问题描述】:

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

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();

【问题讨论】:

两者都不是。请使用destructor。 如果可以避免的话,不要使用 new 或 delete。使用vector Are there any valid use cases to use new and delete, raw pointers or c-style arrays with modern C++? 【参考方案1】:

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

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])  
;

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

【讨论】:

【参考方案2】:

我应该使用 delete 重载或 del() 函数或其他方法来释放类成员吗?

都没有。

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

class Field

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

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

【讨论】:

【参考方案3】:

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

所以你会写

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

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

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

第三,如果自动存储持续时间也是一个选项,请避免使用new 分配对象。因此,如果您写了以下代码,您将克服整个问题:

class Field

private:
    size_t square[5];
;

int main() 
    Field f;

【讨论】:

以上是关于如何正确释放类成员?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用QtConcurrent运行类成员函数

如何正确释放 ID3D11ShaderResourceView** 以避免内存泄漏?

[C++] 智能指针的引用计数如何实现?—— 所有该类的对象共享静态类成员变量

类成员的正确语法函数指针列表是啥?

如何初始化使用其他模板类的模板类成员?

访问包含在数组中的指向类对象的类成员函数的正确语法是啥?