C++实现Dynamic Array时内存管理错误导致运行结果异常求助
问题原因分析
1. 指针悬空错误(直接导致乱码)
你在memLoc扩容函数中,T* newArray = new T[n_capacity]; 申请了新的堆内存,完成数据拷贝后执行dataArray = newArray;,此时dataArray和newArray指向完全相同的堆内存地址,紧接着delete[] newArray;直接把这块内存释放了。后续你访问dataArray时,实际访问的是已经被系统回收的无效内存,读取到的就是不确定的垃圾值,也就是你看到的乱码。
同时你完全没有释放旧的dataArray指向的内存,还存在内存泄漏问题。
2. 构造函数变量屏蔽错误
构造函数中你写了T* dataArray = new T[a_size];,这里定义了和类成员变量同名的局部变量,你给这个局部变量申请了内存,但类的成员变量dataArray根本没有被初始化,后续访问本身就是野指针,存在稳定性隐患。
修复代码
扩容函数修复
void memLoc(int n_capacity) { T* newArray = new T[n_capacity]; for (int i = 0; i < a_size; i++) { newArray[i] = dataArray[i]; } // 先释放旧内存 delete[] dataArray; // 再把成员指针指向新申请的内存 dataArray = newArray; // 不要释放newArray,此时dataArray还在使用这块内存 a_capacity = n_capacity; }
构造函数修复
Darray() { // 不要定义同名局部变量,直接给成员变量赋值 dataArray = new T[a_size]; memLoc(2); }
额外优化建议
- 扩容时需要判断
a_capacity * expandFactor是否为0,避免初始容量为0时扩容失败 - 补充析构函数释放
dataArray内存,避免程序运行全程的内存泄漏 - 补充拷贝构造、移动构造、拷贝赋值、移动赋值函数,遵守C++三五法则,避免浅拷贝导致的double free问题
内容的提问来源于stack exchange,提问作者Swagelele
相关产品推荐
相关产品推荐

