为什么运算符 new 清除的内存多于请求的内存
Why does the operator new clear more memory than requested?
我正在尝试学习和理解 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 时,程序会转到这个地方并找到足够长的未使用字节长度以满足您的请求,并将其的第一个内存值返回到您的指针,因为它所有这些都已经定义,我可以转到下一个值并读取它。
通常,内存分配器从用于分配各种类型的对象的单个池中提取。通常,他们使用内存块来跟踪自己的会计信息,而这些信息是空闲的。这些东西中的每一个都对每个块施加了一定的最小大小。前者是因为每个块都必须满足实现的最严格的对齐要求。后者是因为每个块通常必须至少足够大以容纳两个指针和一个整数(指向上一个空闲块的指针、指向下一个空闲块的指针和块的大小)。
相关文章:
- 将字符串存储在c++中的稳定内存中
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 每个服务器请求的内存预算
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- 内核AIO(libaio)写入请求在启动时从保留的内存中写入时失败
- 是指向在向函数返回值/参数和类请求传输数据期间复制的内存的指针
- 为什么运算符 new 清除的内存多于请求的内存
- 使用套接字发送 POST 请求,但占用大量内存功率
- 动态内存请求会导致错误的原因是什么
- 如何计算动态内存请求是否会导致无效分配
- 自定义运算符new[]请求大于预期的内存
- C++:请求超过 2GB 的内存