为什么下面的C++代码会出现内存泄漏?

Why is there a memory leak in the following C++ code?

假设一个名为 Vec 的 class 存在一个名为 arr 的矢量,因为它是唯一的成员。以下代码不会泄漏内存。 (这意味着我的 Vec 析构函数按预期工作。)

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

但是,在下面的代码中,内存泄漏。但为什么?我似乎每次使用 new 都有一个 delete。我错过了什么?

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

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

    delete obj;
}

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

当你再次说 Vec* obj = 时,而不只是 obj =,你隐藏了旧变量,而不是更新它。结果,您泄漏了第二个 obj,更糟糕的是,您双重释放了第一个。

在 if 条件中声明的 Vec* obj 在另一个范围内。您正在范围之外执行另一个删除,该范围指向您在 main() 开头声明的 Vec* 对象。 因此,如果条件是您的内存泄漏

,则在内部分配的 Vec 数组

范围。

Vec* obj = new Vec(6); 创建一个名为 obj 的新变量,它只存在于 if 的主体中,并在外部范围隐藏 obj。内部 obj 超出范围并消失在 if 主体的末尾,并带走了指向新分配的最后一个指针。然后代码在外部范围 (not a good thing to do) 重新 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;
}

删除条件语句中的 "Vec*" 将修复内存泄漏。您在条件语句中定义了一个 Vec 类型的新指针(恰好也称为 obj),并且从不释放该内存。两个 "delete" 都引用第一个 "obj",因为第二个 "obj" 超出范围而没有在条件结束时被删除。