首页 > 解决方案 > 如何删除在类旁边用“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”处的内存,如何重新配置​​此代码以便可以做到这一点?

标签: c++classstructnew-operatordelete-operator

解决方案


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.


推荐阅读