C++ 为什么指针会导致内存泄漏到动态分配的整数?

C++ 为什么指针会导致内存泄漏到动态分配的整数?,c++,pointers,memory,memory-leaks,C++,Pointers,Memory,Memory Leaks,由于pnValue是保存动态分配的整数地址的唯一变量,当pnValue被销毁时,将不再引用动态分配的内存。这称为内存泄漏。因此,无法删除动态分配的整数,因此无法重新分配或重用 为什么pnValue保存动态分配的整数的地址? 如果指针只是指向地址,为什么销毁指针会影响地址? 这是否意味着在动态分配的整数中,我们必须始终有指针,因为指针在某种程度上是地址?指针“只指向地址”。这意味着,如果删除所有指向该地址的指针,就无法“访问”存储在那里的内存以删除/释放它。一旦没有指针“指向”那个位置,你就无法再

由于pnValue是保存动态分配的整数地址的唯一变量,当pnValue被销毁时,将不再引用动态分配的内存。这称为内存泄漏。因此,无法删除动态分配的整数,因此无法重新分配或重用

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

指针“只指向地址”。这意味着,如果删除所有指向该地址的指针,就无法“访问”存储在那里的内存以删除/释放它。一旦没有指针“指向”那个位置,你就无法再清理那个内存了,所以你就有漏洞了


销毁指针不会产生泄漏-如果您可以使用另一个指针访问内存以清除它。如果没有其他指针保留,销毁指针只会删除访问该内存的能力。

指针不指向地址,而是存储地址。它们被称为“指向”对象。它们指向的对象是位于它们存储的地址中的对象


想想地址簿。每个条目都是指向您的一个朋友(您的朋友是对象)的指针。假设你的朋友遍布全国(你的电脑内存),而你的内存是垃圾。所以你需要你的通讯录来找到你的朋友。如果您丢失了通讯簿中的一页(指针已损坏),则该页上地址的朋友将丢失给您。也就是说,除非您有一个备份副本(更多的指针持有相同的地址)。

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

 99 100 101  102  103  104  105  106
=====================================
   | O  | B  | J  | E  | C  | T  |    
=====================================
     ^
     |
     |
 pnObject
Object *pnValue = new Object();
指针是包含其他对象地址的对象。动态创建对象时,它是在堆内存中创建的,没有作用域。只要你不知道,它就会继续存在;不要显式删除分配的内存,否则分配内存的程序会死掉

内存是通过c库函数
malloc
c++
操作符
new
动态分配的,它返回地址,即对象开始驻留的堆内存中的起始位置。您应该将地址保存在变量(一种称为指针的特定类型)中,该变量现在保存对象的地址

 99 100 101  102  103  104  105  106
=====================================
   | O  | B  | J  | E  | C  | T  |    
=====================================
     ^
     |
     |
 pnObject
Object *pnValue = new Object();
只要您知道堆中新创建的对象的地址,您就有控制权,但是如果您忘记了地址,或者是通过销毁指针变量、覆盖内容,或者只是不存储地址,您就无法访问该位置,并且无法释放/删除分配的内存

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

正如Benjamin所说,指针存储您想要访问的数据的地址。 如果创建指针,还必须保留所需的内存。否则,您可以轻松创建访问冲突。您还应该意识到,内存泄漏不仅令人讨厌,因为应用程序的虚拟空间增加了,而且对指针的错误处理也是每个想闯入您的应用程序或系统的人的一个很好的切入点。 要查找内存泄漏,有一些项目@codeproject.com,如下所示:

为什么pnValue保存动态分配的整数的地址?如果指针只是指向地址,为什么销毁指针会影响地址

你会被“地址”这个词的两种不同用法弄糊涂。这个词既可以用来指如何定位一个地方的信息,也可以用来指这个地方本身。考虑:

1) 我已经把地址写在一张纸上了

2) 我现在开车去那个地址

使用第一种感觉,指针存储地址;有关如何定位特定数据或内存的信息。使用另一种意义,指针指向一个地址;它们指向数据或内存的位置。就像你在一张纸上写下一个地址(到达一个地方的信息),这张纸现在指向地址(那个地方)

因此,销毁指针会销毁有关如何访问该位置的信息

这是否意味着在动态分配的整数中,我们必须始终有指针,因为指针就是地址


当您使用
new
分配内存时,系统会向您提供有关如何访问分配内存的信息。如果您最终未能将相同的信息返回给
delete
,则会发生泄漏。因此,是的,您必须始终以某种方式维护该信息,以便最终将其返回给
delete

我认为指针是“可选的”:我们不必创建指针。@从某种意义上说,Raindrop是,您可以选择将数据存储在堆栈上。但是,堆栈的大小有限。此外,任何集合(
列表
映射
,等等)都将分配内存来存储它们的项目,但它们会对用户隐藏它。想知道delete[]实际上是如何工作的?假设我们有一个“新的未签名字符[100];”,然后调用delete[]。应用程序如何知道这100个字节现在又是空闲的?或者更确切地说,它如何存储它必须释放的100个字节。@AntonRoth:这是一个单独的问题,但简而言之,几乎所有的实现都将分配的内存大小存储在t之前的头结构中