这是一个我无法找到答案的基本问题。
鉴于下一个代码,将发生内存泄漏:
int main(){
A* a = new A();
// 1
}
//2
假设 a 的值为1000.也就是说,堆上的地址1000现在由A对象占用。在1,a == 1000和2 a超出范围。但缺少一些信息。
在现实生活中,地址1000是存储器中一个字节的地址。该字节没有存储有价值信息的信息。
我的问题:
谁保留这些信息?
这些信息是如何保存的?
哪个组件“知道”指针 a 指向的位置?计算机如何知道指向 sizeof(A)字节?
谢谢!
答案 0 :(得分:6)
a
sizeof(A)
字节被保留” - 并且您不能使用该信息,您只需要将这些字节视为包含{{1} } 答案 1 :(得分:4)
语言标准没有说明。
我们所知道的是,如果我们delete a
,则会再次释放内存。
有几个选项,比如从一个地址为1000到1000 + x的特定内存池中分配sizeof(a)的所有内容。或者某人(语言运行时或操作系统)可以在某个地方保持在桌面上。或者别的什么。
答案 2 :(得分:3)
通常,new和delete运算符在malloc和free之上实现,但未指定此详细信息。 malloc和free都指向一个数据结构,它跟踪哪些内存区域被分配,哪些区域没有,以及每个区域有多大。 Knuth的计算机程序设计第1卷对一些分配器设计有很好的描述。
答案 3 :(得分:0)
a
。a
的类型是A*
。所以它知道a
中所在位置的对象应该是一个A对象。如果你在那个位置有其他物体,那就是你遇到问题的原因。生成的机器代码就像A对象在那里一样,所以如果没有(也许那里有派生类)那么它必须被构建为能够存活它(在派生的情况下是虚函数表)类)。一旦本地指针超出范围,它将从堆栈中取出。如果那是指向堆上对象的唯一指针,那么你就失去了删除它的任何方法。这就是你得到内存泄漏的原因。突然间你不知道对象在哪里了,因为你失去了唯一的指针。