如何删除 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;
}