程序是否会不知情使用自由存储未分配内存?重分配内存垃圾值成因?
未初始化内存的垃圾值来源疑问
在栈或自由存储上定义未初始化变量时,通常会包含垃圾值,因为为其分配默认值(如0)纯粹是浪费性能。示例:
int foo;//未初始化的foo可能包含任意值 int* fooptr=new int;//未初始化的*fooptr可能包含任意值
常见解释是new、malloc等动态分配内存的方式不会初始化内存,垃圾值是之前使用该内存的程序遗留。但我做了如下测试,发现情况并非完全符合这个解释:
测试代码
#include <iostream> int main() { int* ptr= new int[10]{0};//分配内存并将所有值初始化为0 for (int i=0;i<10;++i) { std::cout<<*(ptr+i)<<" "<<ptr+i<<std::endl; } delete[]ptr; ptr= new int[10];//分配内存但不初始化 for (int i=0;i<10;++i) { std::cout<<*(ptr+i)<<" "<<ptr+i<<std::endl; } delete[]ptr; }
输出结果
0 0x1291a60 0 0x1291a64 0 0x1291a68 0 0x1291a6c 0 0x1291a70 0 0x1291a74 0 0x1291a78 0 0x1291a7c 0 0x1291a80 0 0x1291a84 19471096 0x1291a60 19464384 0x1291a64 0 0x1291a68 0 0x1291a6c 0 0x1291a70 0 0x1291a74 0 0x1291a78 0 0x1291a7c 0 0x1291a80 0 0x1291a84
疑问点
我两次分配了10个int的内存:第一次初始化全为0,调用delete[]后立即再次分配但不初始化。输出显示同一块内存地址的前两个int出现了垃圾值,说明delete与重新分配之间有操作篡改了内存值。但自由存储不是由new和delete管理的吗?是什么导致了内存值被篡改?
编辑说明:已移除std::cout,使用Eclipse 2022-06自带的MinGW GCC编译器(默认编译选项),运行环境为Windows 10。
内容的提问来源于stack exchange,提问作者Aiko
相关产品推荐
相关产品推荐

