You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序是否会不知情使用自由存储未分配内存?重分配内存垃圾值成因?

未初始化内存的垃圾值来源疑问

在栈或自由存储上定义未初始化变量时,通常会包含垃圾值,因为为其分配默认值(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:27:30