如何删除 class 中用 "new" 和 class 声明的对象
How to delete an object inside of a class declared with "new" alongside the class
假设我们要创建一个包含对象的 class / 结构,并用它的新实例重复替换指向该 class / 结构的对象的指针。
struct foo {
int a[128];
};
int main() {
foo* bar;
for(int i = 0; i < 120000; i++) {
delete bar;
bar = new foo();
}
return 0;
}
据我所知,该程序有效,并成功释放了 'a' 在删除 'foo' 时使用的内存(任务管理器告诉我它使用了大约 14.5 MB 的 RAM ).但与其以这种方式声明,不如说我们需要一个动态对象:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
};
int main() {
FOO* BAR;
for(int i = 0; i < 120000; i++) {
delete BAR;
BAR = new FOO();
}
return 0;
}
在这种情况下,程序似乎没有成功释放存储在 'A' 的内存(任务管理器告诉我这使用了大约 78.1 MB 的 RAM)。为什么删除 BAR 的调用无法释放 'A' 处的内存,如何重新配置此代码才能做到这一点?
您缺少的是 Foo 结构中的析构函数。查看此变体:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
~FOO()
{
delete A[];
}
};
int main() {
FOO* BAR;
for(int i = 0; i < 120000; i++) {
delete BAR;
BAR = new FOO();
}
return 0;
}
FOO 的析构函数现在应该负责删除在构造函数中动态创建的内存。
您需要实现析构函数以释放在构造函数中分配的内存。然而,在构造函数内部分配内存是个坏主意,有更好的替代方法。
此外,由于您正在处理指针,请确保您正在检查内存分配结果并在需要时正确分配 NULL 以及检查删除指针是否安全
注意1:因为你已经使用new分配数组,你必须使用delete[]而不是delete.
注 2:您甚至在分配之前也开始删除 BAR。
它至少应该看起来像这样:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
~FOO() {
if(A) delete[] A; // use delete[] instead of delete for an array
A = nullptr;
}
};
int main() {
FOO* BAR;
BAR = new FOO();
for(int i = 0; i < 120000; i++) {
if( BAR) {
delete BAR;
BAR = nullptr;
}
BAR = new FOO();
}
return 0;
}
假设我们要创建一个包含对象的 class / 结构,并用它的新实例重复替换指向该 class / 结构的对象的指针。
struct foo {
int a[128];
};
int main() {
foo* bar;
for(int i = 0; i < 120000; i++) {
delete bar;
bar = new foo();
}
return 0;
}
据我所知,该程序有效,并成功释放了 'a' 在删除 'foo' 时使用的内存(任务管理器告诉我它使用了大约 14.5 MB 的 RAM ).但与其以这种方式声明,不如说我们需要一个动态对象:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
};
int main() {
FOO* BAR;
for(int i = 0; i < 120000; i++) {
delete BAR;
BAR = new FOO();
}
return 0;
}
在这种情况下,程序似乎没有成功释放存储在 'A' 的内存(任务管理器告诉我这使用了大约 78.1 MB 的 RAM)。为什么删除 BAR 的调用无法释放 'A' 处的内存,如何重新配置此代码才能做到这一点?
您缺少的是 Foo 结构中的析构函数。查看此变体:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
~FOO()
{
delete A[];
}
};
int main() {
FOO* BAR;
for(int i = 0; i < 120000; i++) {
delete BAR;
BAR = new FOO();
}
return 0;
}
FOO 的析构函数现在应该负责删除在构造函数中动态创建的内存。
您需要实现析构函数以释放在构造函数中分配的内存。然而,在构造函数内部分配内存是个坏主意,有更好的替代方法。
此外,由于您正在处理指针,请确保您正在检查内存分配结果并在需要时正确分配 NULL 以及检查删除指针是否安全
注意1:因为你已经使用new分配数组,你必须使用delete[]而不是delete.
注 2:您甚至在分配之前也开始删除 BAR。
它至少应该看起来像这样:
struct FOO {
int* A;
FOO() {
A = new int[128];
}
~FOO() {
if(A) delete[] A; // use delete[] instead of delete for an array
A = nullptr;
}
};
int main() {
FOO* BAR;
BAR = new FOO();
for(int i = 0; i < 120000; i++) {
if( BAR) {
delete BAR;
BAR = nullptr;
}
BAR = new FOO();
}
return 0;
}