为什么下面的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) 重新 delete
s 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" 超出范围而没有在条件结束时被删除。
假设一个名为 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) 重新 delete
s 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" 超出范围而没有在条件结束时被删除。