模板类中二维数组内存释放异常问题求助
问题排查与修复方案
嘿,我帮你找到了导致程序崩溃生成栈转储文件的根源!问题确实出在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
相关产品推荐
相关产品推荐

