为什么运算符 new 清除的内存多于请求的内存

Why does the operator new clear more memory than requested?

本文关键字:内存 请求 于请求 清除 运算符 为什么 new      更新时间:2023-10-16

我正在尝试学习和理解 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;
}

我对为什么会发生这种情况的猜测是,动态内存是堆栈(或其保存的任何位置)中的预定义空间,在程序开始时已经清除为零,因此当您使用运算符 new 时,程序会转到这个地方并找到足够长的未使用字节长度以满足您的请求,并将其的第一个内存值返回到您的指针,因为它所有这些都已经定义,我可以转到下一个值并读取它。

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