C ++ - 内存泄漏:指针(元)信息存储在哪里?

时间:2011-04-02 20:22:49

标签: c++ memory memory-leaks

这是一个我无法找到答案的基本问题。

鉴于下一个代码,将发生内存泄漏:

   int main(){
          A* a = new A();
          // 1
     } 
     //2

假设 a 的值为1000.也就是说,堆上的地址1000现在由A对象占用。在1,a == 1000和2 a超出范围。但缺少一些信息。

在现实生活中,地址1000是存储器中一个字节的地址。该字节没有存储有价值信息的信息。

我的问题:

  1. 谁保留这些信息?

  2. 这些信息是如何保存的?

  3. 哪个组件“知道”指针 a 指向的位置?计算机如何知道指向 sizeof(A)字节?

  4. 谢谢!

4 个答案:

答案 0 :(得分:6)

  1. 此信息保存在您的程序中,变量a
  2. 编译时编译器知道这一点。运行时只有分配器知道“在此特定地址sizeof(A)字节被保留” - 并且您不能使用该信息,您只需要将这些字节视为包含{{1} }

答案 1 :(得分:4)

语言标准没有说明。

我们所知道的是,如果我们delete a,则会再次释放内存。

有几个选项,比如从一个地址为1000到1000 + x的特定内存池中分配sizeof(a)的所有内容。或者某人(语言运行时或操作系统)可以在某个地方保持在桌面上。或者别的什么。

答案 2 :(得分:3)

通常,new和delete运算符在malloc和free之上实现,但未指定此详细信息。 malloc和free都指向一个数据结构,它跟踪哪些内存区域被分配,哪些区域没有,以及每个区域有多大。 Knuth的计算机程序设计第1卷对一些分配器设计有很好的描述。

答案 3 :(得分:0)

  1. 内存地址存储在变量a
  2. 它只是像任何其他局部变量一样保存在堆栈上的值。只是一个普通的旧数字,指的是存储A对象的内存位置。
  3. 编译器知道a的类型是A*。所以它知道a 中所在位置的对象应该是一个A对象。如果你在那个位置有其他物体,那就是你遇到问题的原因。生成的机器代码就像A对象在那里一样,所以如果没有(也许那里有派生类)那么它必须被构建为能够存活它(在派生的情况下是虚函数表)类)。
  4. 一旦本地指针超出范围,它将从堆栈中取出。如果那是指向堆上对象的唯一指针,那么你就失去了删除它的任何方法。这就是你得到内存泄漏的原因。突然间你不知道对象在哪里了,因为你失去了唯一的指针。