C++构造函数初始化二维数组固定位置出现48异常值问题求助
问题根因
该问题完全由C++动态内存的初始化规则导致,属于典型的未定义行为:
- 你使用
new int[size]申请的动态数组属于默认初始化,对于int这类基础数据类型,默认初始化不会清空内存空间,数组里存储的是对应内存地址之前遗留的任意垃圾值。你看到的48、部分尺寸下数值为0都只是随机现象,和你的代码逻辑没有必然关联,不同运行环境、不同运行时点输出的结果都可能发生变化。 - 你观察到的「尺寸为12到20时无异常」只是巧合:这几个尺寸下你申请到的内存刚好是操作系统刚分配的、已经清零的内存页,不代表此时代码逻辑正确。
修复方法
你必须主动为数组元素设置初始值,有两种常见的修改方案:
- 方案1:申请内存时直接做值初始化,只需要修改构造函数里的数组申请语句,在末尾加一对空括号即可自动将所有元素初始化为0:
将graph[i] = new int [size];改为graph[i] = new int[size](); - 方案2:显式遍历数组赋值,申请完每一行数组后,加一层循环手动给所有元素赋值为0。
额外优化建议
你当前的代码存在内存泄漏问题:动态申请的二维数组没有在类的析构函数中对应释放。建议要么补充析构函数释放内存,要么直接用std::vector<std::vector<int>>替代手动管理的二级指针,不需要自行处理内存申请、释放、初始化逻辑,更不容易出问题。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

