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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:06:07