如何正确释放类成员?
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 &f
那样删除具有自动存储持续时间的对象。
第三,如果自动存储持续时间也是一个选项,请避免使用new
分配对象。因此,如果您写了以下代码,您将克服整个问题:
class Field
private:
size_t square[5];
;
int main()
Field f;
【讨论】:
以上是关于如何正确释放类成员?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确释放 ID3D11ShaderResourceView** 以避免内存泄漏?