【发布时间】:2019-06-18 19:27:57
【问题描述】:
我很难理解如何区分悬空指针和内存泄漏。我最近的一个作业有几个问题让我感到困惑,读完之后我仍然感到困惑。我不希望有人为我做作业,我希望能够理解为什么某件事是这样的,如果这有意义的话。
所以,作业:
鉴于声明:
int *ptrA, *ptrB;
判断下面的每个代码段是否导致内存泄漏、悬空指针或两者都没有。画图帮忙。
- 我猜这很好,因为
ptrA已经指向内存中的某些内容,所以这个既不是悬空指针也不是内存泄漏。
ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = ptrA;
- 我猜这是一个悬空指针,因为 345 已从内存中释放,所以
ptrB指向任何内容。
ptrA = new int;
*ptrA = 345;
ptrB = ptrA;
delete ptrA;
- 这是我完全迷路的地方。最后一行是否意味着指针指向另一个指针?不确定这会产生什么影响。
ptrA = new int;
ptrB = new int;
*ptrA = 345;
*ptrB = *ptrA;
- 与上一个问题一样,我不确定指向指针是什么意思,或者我是否明白这样做的目的。
ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = new int;
*ptrB = *ptrA;
- 我知道这是一个悬空指针,但我不知道为什么。是不是因为指针指向的局部变量在函数完成时超出了作用域?
ptrA = LocationOfAge();
其中函数LocationOfAge定义为:
int *LocationOfAge() {
int age = 21;
return &age;
}
感谢任何愿意提供帮助的人。
【问题讨论】:
-
一个问题应该包含一个问题。这包含五个。它们密切相关,但你可能会推动它。
ptrB = ptrA;in 1 刚刚泄露了ptrB。它持有的地址已经没有了,所以没有办法删除它持有的东西。 -
@user4581301 评论不应包含答案:)
-
为每个
new画一个框。对于每一个删除框(你没有那些)。对于每个a = b(没有星号的地方)画一条从变量到框的线。对于每个*x = y,在框内写上 y。当你有一个没有变量指向它的盒子时,你就有了泄漏。如果你有一个不指向盒子的指针,你就有一个悬空指针。 -
这只是答案的 1/5。
-
快速评论悬空指针和内存泄漏之间的区别:它们(几乎)是相反的。悬空指针指向一块已分配但已解除分配的内存。可能会重新分配给其他东西。内存泄漏是活动程序中没有指针指向的内存。 (在其他泄露的对象中可能有指向它的指针。)
标签: c++ pointers memory-leaks