如何正确解除分配 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;
}
我应该使用 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;
}