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

自定义模拟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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:03