自定义模拟vector的ArrayList类出现内存泄漏,求代码问题排查
代码问题分析及修复方案
存在的核心问题
- 内存操作位置错误:
insert和remove方法中,delete [] arr和arr = tempArr的代码放在了for循环内部,第一次循环就会释放原始数组的内存,后续循环访问arr都是野指针操作,同时未完成新数组全量拷贝就修改arr指向,会导致内存数据混乱。 remove拷贝逻辑错误:现有逻辑遇到待删除下标直接跳过赋值,会导致新数组从该下标开始的位置全部没有正确赋值,正确逻辑应为:新数组下标>=index的位置,对应原数组下标+1的位置。- 缺少下标越界校验:
at、insert、remove方法均未校验index的合法性,会引发非法内存访问,不符合容器类的安全设计要求。 - 缺少析构函数引发内存泄漏:你的需求提到无需定义三大特殊成员,但类中持有动态分配的堆内存,必须实现析构函数在对象销毁时释放内存,否则
arr指向的内存永远不会被回收,这是内存泄漏报错的根本原因。
修复后的代码
头文件(ArrayList.h)
#ifndef ARRAYLIST_H #define ARRAYLIST_H #include <cstdlib> class ArrayList{ private: int listSize; int* arr; public: ArrayList(); // 新增析构函数释放动态内存 ~ArrayList(); int size() const; int at(int index) const; void insert(int index, int value); void remove(int index); }; #endif // ARRAYLIST_H
实现文件(ArrayList.cpp)
#include <stdexcept> #include "ArrayList.h" ArrayList::ArrayList() { listSize = 0; arr = new int[listSize]; } // 析构函数实现 ArrayList::~ArrayList() { delete[] arr; } int ArrayList::size() const{ return listSize; } int ArrayList::at(int index) const{ // 新增越界校验,抛出标准异常 if (index < 0 || index >= listSize) { throw std::out_of_range("下标越界"); } return arr[index]; } void ArrayList::insert(int index, int value) { // 新增下标合法性校验:允许插入到末尾(index == 原listSize) if (index < 0 || index > listSize) { throw std::out_of_range("插入下标非法"); } int newSize = listSize + 1; int* tempArr = new int[newSize]; for(int i = 0; i < newSize; i++){ if(i < index){ tempArr[i] = arr[i]; } else if(i == index){ tempArr[i] = value; } else{ tempArr[i] = arr[i - 1]; } } // 循环结束完成拷贝后,再释放旧内存、修改指针指向 delete[] arr; arr = tempArr; listSize = newSize; } void ArrayList::remove(int index){ if (index < 0 || index >= listSize) { throw std::out_of_range("删除下标非法"); } int newSize = listSize - 1; int* tempArr = new int[newSize]; for(int i = 0; i < newSize; i++){ if (i < index) { tempArr[i] = arr[i]; } else { tempArr[i] = arr[i + 1]; } } // 循环结束后再操作内存 delete[] arr; arr = tempArr; listSize = newSize; }
内容的提问来源于stack exchange,提问作者Ayo
相关产品推荐
相关产品推荐

