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

标签 c++ pointers memory memory-leaks

“Because pnValue is the only variable holding the address of the dynamically allocated integer, when pnValue is destroyed there are no more references to the dynamically allocated memory. This is called a memory leak. As a result, the dynamically allocated integer can not be deleted, and thus can not be reallocated or reused.” {quoted from LearnCpp.}

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

最佳答案

所有被定义的对象都存在于内存中,并且有一个地址。对象的地址是对象开始驻留的内存位置。所以在一维内存空间中,如果一个对象开始驻留在槽位 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  |    
=====================================

关于c++ - 为什么指针会导致内存泄漏到动态分配的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243523/

相关文章:

c++ - 增量决策树 C++ 实现

c++ - 如何将鼠标移动到第二屏幕显示器?

c - 使用二叉搜索树进行井字棋(C)

c++ - 为什么没有为 "T* const"定义 pointer_traits ?

c - 在文件中搜索字符串 (C)

c++ - C++ 中动态分配内存的初始值

c++ - 警告 LNK4098 : defaultlib 'mfc110u.lib' conflicts with use of other libs

c++ - 三角形二维数组比矩形数组占用更多内存

可以直接获取 "stack"中间的元素吗?

c++ - Thread C++ 成员函数模板可变参数模板