假设存在一个名为的类Vec 作为唯一成员存在一个带有arr的 vector 。以下代码不会泄漏内存。 (这意味着我的Vec的析构函数正在按预期方式工作。)

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

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

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

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

    delete obj;
}

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

最佳答案

范围。
Vec* obj = new Vec(6);生成一个名为obj的新变量,该变量仅存在于if的主体内,并且将obj隐藏在外部作用域中。内部obj超出范围,并在if主体的末尾消失,并带有指向该新分配的最后一个指针。然后,代码在外部范围(not a good thing to do)上将delete重新编码为obj

解决方案:

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

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

    delete obj;
}

关于c++ - 为什么以下C++代码中发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60200087/

10-11 22:06
查看更多