[英]C++ Dangling Pointers and Memory Leaks
我很难理解如何分辨悬空指针和内存泄漏。 关于最近的任务令我感到困惑,我有几个问题,在阅读之后,我仍然感到困惑。 我不希望有人为我做我的作业,我希望能够理解为什么它是什么,如果这是有道理的。
所以,作业:
鉴于声明:
int *ptrA, *ptrB;
判断下面的每个代码段是否导致内存泄漏,悬空指针或两者都没有。 画画帮忙。
ptrA
已经指向内存中的某些东西,所以这个既不是悬空指针也不是内存泄漏。 ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = ptrA;
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;
}
感谢愿意提供帮助的任何人。
游戏规则:
new Type
绘制一个框。 在框中提出一个问题(你不知道那里有什么)。 delete p
跨越开箱通过指向p
。 a = b
(没有星星),从变量a
到框b
绘制一条线。 *x = y
在x
指向的框内写y
。 *x = *y
读取框y
的内容并将副本放在x
结果:
第一个问题:
ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = ptrA;
让我们一行一行:
ptrA = new int;
// Part 1 has a new so draw a box
*********
* ? *
*********
// Part 2 assignment to variable add a line
ptrA -------> *********
* ? *
*********
ptrB = new int;
// Part 3 has a new so draw another box
ptrA -------> *********
* ? *
*********
*********
* ? *
*********
// Part 4 assignment to variable add a line
ptrA -------> *********
* ? *
*********
ptrB -------> *********
* ? *
*********
* ptrA = 345;
ptrA -------> *********
* 345 *
*********
ptrB -------> *********
* ? *
*********
ptrB = ptrA;
ptrA -------> *********
| * 345 *
| *********
|
ptrB ---- *********
* ? *
*********
好像你有一个泄漏的盒子。 即有一个没有变量指向它的框。
- 我猜这很好,因为ptrA已经指向内存中的某些东西,所以这个既不是悬空指针也不是内存泄漏。
是的,但现在ptrB
指向它,你无法释放ptrB
之前指出的东西。
这是一个泄漏。
- 我猜这是一个悬空指针因为345从内存中释放出来,所以ptrB指向什么都没有。
正确。
- 最后一行是否意味着指针指向另一个指针?
不,它给出了< ptrB
指向的东西> < ptrA
指向的东西>的值。 所涉及的指针没有变化,只有int
赋值。
- 像前一个问题一样,我不确定指向指针的含义,或者我是否理解这是实现了什么。
第二个new int
被泄露,因为过去指向它的东西( ptrB
)现在指向第三个 new int
而前者不能再被释放。
- 我知道这是一个悬垂的指针,但我不知道为什么。 是因为指针指向一个在函数完成时超出范围的局部变量?
是。
为了防止完成所有作业,你的第一个假设是错误的。
1. ptrA = new int;
2. ptrB = new int;
3. *ptrA = 345;
4. ptrB = ptrA;
在第1行中,ptrA创建一个新的整数(分配字节),在第2行中,ptrB分配字节。 比在3中,1中分配的内存被填充,这是可以的。 但是,在第4行中,ptrB被地址3覆盖,这意味着ptrB的原始地址不再可达。 因此存在内存泄漏,因为不再能够访问由第2行为整数PtrB分配的字节,因为没有指针指向它。
如果你写一个绘图,通过使用箭头指针和一个带有?的框,会容易得多? 填写时的声明和特定值。所以它看起来像:
1. ptrA -> [ ? ]
2. ptrA -> [ ? ], ptrB -> [ ? ]
3. ptrA -> [ 345 ], ptrB -> [ ? ]
4. ptrA -> [ 345 ] <- ptrB, [ ? ]
如你所见,最后一个方框[? ]没有指向它的指针。
我们一次提出一个问题。
ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = ptrA;
这是一个内存泄漏。 为什么? 因为首先没有delete
。 其次,当你做ptrB = ptrA;
,实际上没有办法为之前由ptrB
指向的对象调用delete
。
ptrA = new int;
*ptrA = 345;
ptrB = ptrA;
delete ptrA;
这是悬空指针的一个例子。 一旦在ptrA上调用delete
,ptrA指向的对象就会被释放。 因此,ptrB指向一个解除分配的位置,其行为未定义。 所以,悬空指针!
ptrA = new int;
ptrB = new int;
*ptrA = 345;
*ptrB = *ptrA;
这里只是因为我们没有调用delete
而存在内存泄漏。 我们正在做的是创建两个对象,分别由ptrA和ptrB指向,两个对象的值都为345.它们仍然在堆中保留空间。 但是为什么两者的价值都是345? 简单。
当你做*ptrA = 345;
,这意味着ptrA指向的对象的值应该设置为345。
当你做*ptrB = *ptrA;
,这意味着ptrB指向的对象的值应该赋值为ptrA指向的对象的值。
这是解除引用运算符的简单功能。
ptrA = new int;
ptrB = new int;
*ptrA = 345;
ptrB = new int;
*ptrB = *ptrA;
这与第一个类似。 在第2行中,ptrB指向动态分配的对象。 执行第4行后,ptrB指向全新的对象。 因此,没有办法解除分配在第2行分配内存的对象。所以,内存泄漏!
int *LocationOfAge() {
int age = 21;
return &age;
}
在这里, age
是一个局部变量,一旦函数结束就会死掉。 因此,任何指向该局部变量的指针都会导致未定义的行为。 所以,悬空指针!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.