为什么以下 C++ 代码中存在内存泄漏?

bab*_*rar 5 c++ memory-leaks c++11

假设存在一个名为Vec的类,其中有一个称为 vector的类,arr因为它是唯一的 member 。以下代码不会泄漏内存。(这意味着我的 Vec 析构函数按预期工作。)

int main() {
    Vec *obj = new Vec(5); // initializes a vector of size 5
    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

然而,在下面的代码,有内存泄漏。但为什么?我似乎delete每次使用new. 我错过了什么?

int main() {
    Vec* obj;
    obj = new Vec(5);

    if (true) {
        delete obj;
        Vec* obj = new Vec(6);
    }

    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

PS:我使用 valgrind 检查了内存泄漏。

use*_*301 10

范围。

Vec* obj = new Vec(6);生成一个新变量obj,该变量只存在于if的主体内,并obj在外部作用域隐藏。内部obj 超出范围并在if主体的末尾消失,并带走指向新分配的最后一个指针。然后,该代码重新deleteS上obj在外部范围(不是一件好事做)。

解决方案:

int main() {
    Vec* obj;
    obj = new Vec(5);

    if (true) {
        delete obj;
        obj = new Vec(6); // re-uses the original obj
    }

    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

  • @babrar因为取消引用悬空指针时的行为未定义。在这种情况下,实现很可能恰好为两个“Vec”对象重复使用相同的内存。 (3认同)