我正在尝试学习和理解c ++中的动态内存,我不在我的家用计算机上,所以我使用的是在线编译器(gcc 4.1.8),我看到一个有趣的事情发生了:
第一个程序打印1并抛出错误:
#include <iostream>
int main() {
int i[1];
i[0] = 1;
i[1] = 2;
std::cout<<i[0]<<endl;
std::cout<<i[1]<<endl;
return 0;
}
第二个程序打印1和2,然后保持打印0:
#include <iostream>
int main() {
int* i = new int[1];
i[0] = 1;
i[1] = 2;
std::cout<<i[0]<<endl;
std::cout<<i[1]<<endl;
std::cout<<i[2]<<endl;
return 0;
}
我猜测为什么会发生这种情况是动态内存是堆栈中的预定义空间(或者保存在哪里),在程序开始时已经被清除为零,这样当你使用operator new时程序转到这个地方并找到一段足够长的未使用字节用于你的请求,并将它的第一个内存值返回给你的指针,因为它已被定义,所以我可以转到下一个值并读取它。
答案 0 :(得分:3)
通常,内存分配器从用于分配各种类型对象的单个池中提取。通常,他们使用内存块来跟踪自己的会计信息,而它是免费的。每个块都对每个块施加一定的最小尺寸。前者因为每个块必须满足实现中最严格的对齐要求。后者因为每个块通常必须至少足够大以容纳两个指针和一个整数(指向前一个空闲块的指针,指向下一个空闲块的指针和块的大小)。