我应该使用public static IEnumerable<int> ArrayDiff(int[] a, int[] b)
重载或delete
函数或其他东西来释放类成员吗?
del()
答案 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;
}