【发布时间】:2022-01-07 07:10:40
【问题描述】:
#include "A.h"
int main (int argc, char*argv[]){
A * p_a1 = new A();
A * p_a2 = p_a1;
delete p_a1;
p_a1 = 0;
delete p_a2 <br>
A 是某个类的这段代码会导致内存管理问题吗?
我的想法:
第一行将创建一个指向 A 的指针。我不确定这是否也会为 A 分配内存,还是只是分配一个地址?第二个指针 p_a2 指向确切的位置。
delete p_a1 将删除分配的内存,它可能没有任何 p_a1=0,使其为空。删除 p_a2。然后我们删除空指针,这可能不会影响
这会导致任何内存泄漏或问题吗?
【问题讨论】:
-
将空值分配给
p_a1对p_a2没有影响。 (了解指针最重要的一点是,指针没有什么特别之处。) -
一般来说,所有新的都有匹配的删除是个好主意,最好在代码附近。
-
A * p_a2 = p_a1;-- 在该行之后,p_a2独立于p_a1。调用delete p_a1;不会神奇地通知p_a2p_a1有delete调用它。确保所有指向该对象的指针都得到通知的所有工作在 C++ 中不存在开箱即用的情况——您必须以某种方式自己维护它,这使得内存管理在许多情况下容易出错案例。如果你想真正共享指向同一个对象的指针,C++ 中有一个叫做std::shared_ptr的东西可以完成所有这些工作。 -
答案是:1) 是的。 2) 从动态存储中为 A 分配内存并构造 A。3) 不正确,删除悬空指针是 未定义的行为。 4) 是的,它会导致未定义的行为(称为“问题”)。