“因为pnValue是唯一保存动态分配的整数地址的变量,所以当pnValue被破坏时,不再有对动态分配的内存的引用。这称为内存泄漏。因此,无法删除动态分配的整数,因此无法重新分配或重用。“{quoted from LearnCpp.}
为什么pnValue保存动态分配的整数的地址? 如果指针只指向地址,为什么破坏指针会影响地址? 这是否意味着在动态分配的整数中,我们必须始终有指针,因为指针以某种方式是地址?
答案 0 :(得分:5)
已定义的所有对象都存在于内存中并具有地址。对象的地址是对象开始驻留的存储器的位置。因此,在一维存储空间中,如果对象开始驻留在插槽100处,那么100就被称为对象的地址。
99 100 101 102 103 104 105 106
=====================================
| O | B | J | E | C | T |
=====================================
^
|
|
pnObject
指针是包含其他对象地址的对象。当您动态创建对象时,它将在堆内存中创建,并且没有作用域。只要你没有,它就会继续存在;显式删除分配的内存或分配内存的程序死掉。
通过c库函数malloc
或c++
运算符new
动态分配内存,它返回地址,即堆内存中起始位置,对象开始驻留的位置。您应该将地址保存在变量(称为指针的特定类型)中,该变量现在保存对象的地址。
Object *pnValue = new Object();
只要您知道堆中新创建的对象的地址,就可以控制但是如果您忘记了地址,通过销毁指针变量,覆盖内容或者只是不存储地址,您将无法访问该位置并且前进不能释放/删除分配的内存。
99 100 101 102 103 104 105 106
=====================================
| O | B | J | E | C | T |
=====================================
答案 1 :(得分:4)
指针“只指向地址”。这就是说,如果删除所有指向该地址的指针,就无法“到达”存储在那里的内存以删除/释放它。只要没有指针“指向”该位置,就再也无法清理那个内存了,所以你就会泄漏。
销毁指针不会造成泄漏 - 如果有另一个指针可以用来到达内存以便清理它。如果没有保留其他指针,则销毁指针会删除到达该内存的能力。
答案 2 :(得分:2)
指针不指向地址,它们存储地址。他们被称为“指向”物体。它们指向的对象是位于它们存储的地址中的对象。
想一下地址簿。每个条目都是指向您的一个朋友的指针(您的朋友是对象)。假设你的朋友遍布全国各地(你的电脑的记忆),你的记忆就是垃圾。所以你需要你的地址簿才能找到你的朋友。如果您丢失了地址簿的页面(指针被销毁),那么地址在该页面上的朋友将丢失给您。也就是说,除非你有备份副本(更多指针持有相同的地址)。
答案 3 :(得分:1)
就像Benjamin所说,Pointer存储了您想要访问的数据的地址。 如果创建指针,还必须保留所需的内存量。否则,您可以轻松创建访问冲突。您还应该意识到内存泄漏不仅令人讨厌,因为应用程序的虚拟空间增加了,但是对于想要打破应用程序或系统的每个人来说,错误的指针处理也是一个很好的切入点。 为了找到内存泄漏,有一些项目@ codeproject.com就像这样: http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
答案 4 :(得分:1)
为什么pnValue保存动态分配的整数的地址?如果指针只指向地址,为什么破坏指针会影响地址?
你对“地址”一词的两种不同用法感到困惑。这个词可以用来指代有关如何定位地点的信息,它可以用来指代地方本身。考虑:
1)我把地址写在一张纸上。
2)我现在开车去了地址。
使用第一个意义,指针存储一个地址;有关如何查找特定数据或内存的信息。使用另一种意义,指针指向一个地址;它们指向数据或内存的位置。就像你在一张纸上写一个地址(到达某个地方的信息)一样,那张纸现在指向地址(地点)。
因此,销毁指针会破坏有关如何访问该位置的信息。
这是否意味着在动态分配的整数中,我们必须总是有指针,因为指针不知何故是地址?
使用new
分配内存时,会向您提供有关如何访问已分配内存的信息。如果您最终无法将相同的信息反馈给delete
,则会发生泄漏。所以,是的,您必须始终以某种方式维护该信息,以便最终将其返回delete
。