【发布时间】:2016-07-08 10:17:12
【问题描述】:
在 SO 问题 [How to allocate a 2D array of pointers in C++] [1] 中,接受的答案还记录了如何取消分配和删除所述数组的正确过程,即“小心删除包含指针、行数组和列数组,它们都以正确的顺序分开。”所以,我已经成功地在元胞自动机模拟程序中使用了这个二维数组。但是,我不能正确地得到这个数组的内存管理。除了上面的参考之外,我没有看到关于如何执行此操作的 SO 答案。
我分配二维数组如下:
Object*** matrix_0 = new Object**[rows];
for (int i = 0; i < rows; i++) {
matrix_0[i] = new Object*[cols];
}
我的徒劳尝试(根据 Valgrind)正确取消分配上述数组如下:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix_0[i][j] = NULL;
}
}
delete [] matrix_0;
matrix_0 = NULL;
显然,我缺少参考 [1] 建议的行和列部分。你能告诉我我错过了什么吗?提前致谢。
[1]:(2009 年 11 月 20 日)How to allocate a 2D array of pointers in C++
【问题讨论】:
-
std::vector<std::vector<std::unique_ptr<Object> > > vector_of_objects; -
您注意二维对象数组还是二维指针数组?
-
@R Sahu:它是一个指向基类对象的二维指针数组,以这种方式设置以利用各种元胞自动机派生对象的多态行为。
-
@Chris 您对
matrix_0[i]数据的分配在哪里?您甚至没有正确进行分配(或者充其量是不完整的)。另外,如果数组在设置后没有改变形状,这在效率方面要好得多:stackoverflow.com/questions/21943621/… 只需使用Base*作为数据类型。 -
@Paul,是的,你是对的,我忽略了那部分,因为对象本身有一个单独的内存取消分配任务,并且似乎与这个问题没有密切关系。