c++ - 如何删除在类旁边用“new”声明的类中的对象
问题描述
假设我们要创建一个包含对象的类/结构,并用它的新实例反复替换指向该类/结构的对象的指针。
struct foo {
int a[128];
};
int main() {
foo* bar;
for(int i = 0; i < 120000; i++) {
delete bar;
bar = new foo();
}
return 0;
}
据我所知,该程序有效,并且在删除“foo”时成功释放了“a”使用的内存(任务管理器告诉我它使用了大约 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”处的内存,如何重新配置此代码以便可以做到这一点?
解决方案
What you are missing is destructor in Foo struct. See this variant :
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;
}
The destructor of FOO should now take care of deleting the memory created dynamically in the constructor.
推荐阅读
- java - 切换 FXML 场景
- css - Nuxt Js 未编译所有 CSS 规则
- lua - 材料不会改变,但只适用于一种情况
- perl - perl 中空 if/elsif/else 块的结构或语法
- vue.js - 如何使用 vue 重新初始化 webglglobe
- python - 需要帮助创建一个沿表面均匀地实例化对象的代码
- apache-spark - 清理 pyspark 数据框中的列值
- python-3.x - 有没有办法使用 GLSL、python 中的 OpenGL 使用鼠标滚轮按钮来描绘像素的垂直滚动运动?
- java - 如何将 Scala 特征转换为 Java 类?
- java - 在处理中围绕旋转平面绘制点的问题?