-1

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

4

1 回答 1

3

通常,内存分配器从用于分配各种类型对象的单个池中提取。通常,他们使用内存块来跟踪自己的会计信息,而它是免费的。这些事情中的每一个都对每个块施加了一定的最小大小。前者是因为每个块都必须满足实现最严格的对齐要求。后者是因为每个块通常必须至少足够大以容纳两个指针和一个整数(指向前一个空闲块的指针、指向下一个空闲块的指针和块的大小)。

于 2013-11-14T00:32:46.147 回答