我正在尝试使用动态内存分配重写我的代码,我正在使用this question(和答案)来帮助我。所以按照Johanes Shaub的建议,我已经将我的二维数组声明为:
double (*q_1_matrix)[TIME] = new double[SPACE][TIME];
当我运行我的代码时,一切似乎都运行正常。但是,当我添加以下行以再次释放内存时:
for(i = 0; i < SPACE; ++i) {
delete [] q_1_matrix[i];
}
delete [] q_1_matrix;
然后我收到警告: 删除数组'*(q_1_matrix +((sizetype)(((long unsigned int)i)* 800ul)))'[默认启用] delete [] q_1_matrix [i]; 然后我得到一个Segmentation故障(核心转储)。
有人知道我做错了吗?
答案 0 :(得分:3)
new
调用实际上创建了一大块内存。它仅被索引为二维数组。
你可以调用delete[] q_1_matrix;
(没有for循环)。
答案 1 :(得分:3)
您提到的问题会限制使用new
的答案,但您几乎肯定不需要new
。
远使用标准库更简单;然后,你所有的担忧都消失了:
std::vector<std::vector<double>> myvec(SPACE, std::vector<double>(TIME));
如果您将std::vector<double>(SPACE*TIME)
包裹在模拟2D索引的类中,那就更好了。
无论如何,如果你真的必须自己管理内存,请记住你在这里创建一个大块动态内存(具有double[SPACE][TIME]
的类型和尺寸),所以你必须只释放一次:
delete[] q_1_matrix;