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

模板类中二维数组内存释放异常问题求助

问题排查与修复方案

嘿,我帮你找到了导致程序崩溃生成栈转储文件的根源!问题确实出在Table.h的析构函数里,咱们来拆解一下:

核心错误:析构函数的内存释放逻辑完全错误

你当前的Table<T>::~Table()代码是这样的:

template<class T>
Table<T>::~Table() {
    for (int i = 0; i < szRow; i++) {
        delete []columns;
    }
    delete columns;
}

这里有两个严重问题:

  • 循环里的delete []columns是重复释放整个指针数组,第一次执行就把columns指向的内存块销毁了,后续循环迭代再访问columns就是访问已经被释放的内存(野指针),直接触发内存访问错误。
  • 每个columns[i]都是通过new RowAray<T>(c)创建的单个对象指针,应该用delete columns[i]来释放,而不是delete[]。

修正后的析构函数代码

把析构函数改成下面这样,就能正确释放内存了:

template<class T>
Table<T>::~Table() {
    // 先逐个释放每一行的RowAray对象
    for (int i = 0; i < szRow; i++) {
        delete columns[i];
    }
    // 最后释放存储指针的数组本身
    delete[] columns;
}

额外优化建议(非崩溃原因)

你的RowAray构造函数里,对于float类型的随机值生成是基于整数转换的,生成的都是整数形式的浮点数(比如10.0、25.0这类)。如果想要生成真正的随机浮点数,可以把构造函数里的赋值语句改成:

// 生成10.0到90.0之间的随机浮点数
rowData[i] = static_cast<T>(rand()) / RAND_MAX * 80.0f + 10.0f;

这个改动不影响程序稳定性,只是让float类型的输出更符合预期。

验证效果

修正析构函数后,程序就能正常运行并释放所有内存,不会再出现cygwin_exception::open_stackdumpfile的错误提示了,矩阵打印的功能也能保持正常。

内容的提问来源于stack exchange,提问作者Vincent Reeve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:32:46