我正在尝试学习和理解 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 时,程序会转到此放置并找到足够长的未使用字节长度以满足您的请求,并将其第一个内存值返回给您的指针,因为它已经全部定义,我可以转到下一个值并读取它。