为什么指针导致内存泄漏动态分配整数?

时间:2013-01-09 17:59:21

标签: c++ pointers memory memory-leaks

  

“因为pnValue是唯一保存动态分配的整数地址的变量,所以当pnValue被破坏时,不再有对动态分配的内存的引用。这称为内存泄漏。因此,无法删除动态分配的整数,因此无法重新分配或重用。“{quoted from LearnCpp.}

为什么pnValue保存动态分配的整数的地址? 如果指针只指向地址,为什么破坏指针会影响地址? 这是否意味着在动态分配的整数中,我们必须始终有指针,因为指针以某种方式地址?

5 个答案:

答案 0 :(得分:5)

已定义的所有对象都存在于内存中并具有地址。对象的地址是对象开始驻留的存储器的位置。因此,在一维存储空间中,如果对象开始驻留在插槽100处,那么100就被称为对象的地址。

 99 100 101  102  103  104  105  106
=====================================
   | O  | B  | J  | E  | C  | T  |    
=====================================
     ^
     |
     |
 pnObject

指针是包含其他对象地址的对象。当您动态创建对象时,它将在堆内存中创建,并且没有作用域。只要你没有,它就会继续存在;显式删除分配的内存或分配内存的程序死掉。

通过c库函数mallocc++运算符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