C++动态数组出现意外输出的原因咨询:为何返回随机内存地址而非预期值
问题根源分析:全局变量初始化与数组越界的未定义行为
嘿,我来帮你拆解下这个问题的根源——你的代码里有两个关键问题导致了随机值输出,都是C++里容易踩的坑:
1. 全局变量index的默认初始化坑
你定义的unsigned long index是全局变量,在C++里全局变量会被默认初始化为0。这直接导致第一次调用test.Set()时出问题:
new T[index]等价于new int[0],这会返回一个合法但不能解引用的指针(因为数组长度为0,没有可访问的元素)- 循环
for (unsigned int i = 0; i < index; i++)因为index=0,循环体根本不会执行,数组里没有任何赋值操作 - 之后
index++让index变成1 - 这时候你访问
test.value_[0],本质是对长度为0的数组做越界访问——这属于C++里的未定义行为,程序会读取内存里的随机垃圾值,所以第一次输出是随机数
2. 第二次调用Set()的越界问题
当你第二次调用test.Set()时,index的值已经是1了:
new T[index]创建了一个长度为1的int数组,循环给target[0]赋值为0- 之后
index++变成2 - 你尝试访问
test.value_[1],但这个数组只有索引0是有效的,索引1再次触发越界访问,又是未定义行为,所以输出还是随机值
修正方案(达到预期输出0和1)
要得到你预期的结果,得改掉全局变量的设计,把数组长度作为参数传入,同时严格控制索引不越界,还要记得管理动态内存避免泄漏:
#include <iostream> template<typename T> class A { public: void Set(unsigned int length) { // 先释放之前的内存,防止内存泄漏 delete[] value_; value_ = new T[length]; for (unsigned int i = 0; i < length; i++) { value_[i] = i; } current_length_ = length; } ~A() { // 析构函数里释放内存,避免泄漏 delete[] value_; } T* value_ = nullptr; unsigned int current_length_ = 0; }; int main() { A<int> test; test.Set(1); // 先判断索引是否有效再访问 if (test.current_length_ > 0) { std::cout << test.value_[0] << '\n'; } test.Set(2); if (test.current_length_ > 1) { std::cout << test.value_[1]; } }
这样运行后就能得到预期的0和1了。
内容的提问来源于stack exchange,提问作者Salty 27
相关产品推荐
相关产品推荐

