C++ c++;如何取消分配和删除指向对象的二维指针数组
在问题[C++中如何分配2D指针数组][1]中,公认的答案还记录了如何取消分配和删除所述数组的正确过程,即“小心以正确的顺序分别删除包含的指针、行数组和列数组。”因此,我已经在一个细胞自动机模拟程序中成功地使用了这个2D阵列。但是,我无法正确管理此阵列的内存。除了上面的参考之外,我看不到关于如何做到这一点的答案 我按如下方式分配2D阵列:C++ c++;如何取消分配和删除指向对象的二维指针数组,c++,arrays,pointers,C++,Arrays,Pointers,在问题[C++中如何分配2D指针数组][1]中,公认的答案还记录了如何取消分配和删除所述数组的正确过程,即“小心以正确的顺序分别删除包含的指针、行数组和列数组。”因此,我已经在一个细胞自动机模拟程序中成功地使用了这个2D阵列。但是,我无法正确管理此阵列的内存。除了上面的参考之外,我看不到关于如何做到这一点的答案 我按如下方式分配2D阵列: Object*** matrix_0 = new Object**[rows]; for (int i = 0; i < rows; i++)
Object*** matrix_0 = new Object**[rows];
for (int i = 0; i < rows; i++) {
matrix_0[i] = new Object*[cols];
}
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;
对象***矩阵_0=新对象**[行];
对于(int i=0;i
我(根据Valgrind)正确取消分配上述阵列的徒劳尝试如下:
Object*** matrix_0 = new Object**[rows];
for (int i = 0; i < rows; i++) {
matrix_0[i] = new Object*[cols];
}
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;
for(int i=0;i
显然,正如参考文献[1]所示,我缺少行和列部分。你能告诉我我错过了什么吗?提前谢谢
[1] :(2009年11月20日)在这方面,你有大量的删除工作要做:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
delete matrix_0[i][j]; // delete stored pointer
}
delete[] matrix_0[i]; // delete sub array
}
delete [] matrix_0; //delete outer array
matrix_0 = NULL;
获取所需内容并将删除工作减少到
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
delete matrix_0[i][j]; // delete stored pointer
}
}
访问权限是
matrix_0[row * cols + col];
这将用一点可见的数学来交换当前在幕后进行的不可见的数学和指针解引用。重要的是向量现在存储为一个很好的连续内存块,增加了空间局部性并减少了缓存未命中的数量。由于对象
的指针分散在内存中而导致的未命中,这是没有帮助的,但你不可能总是赢
关于向量vs数组的一个注记。一旦构建了一个向量
,在这种情况下,这一切都是一次性完成的:
std::vector<std::unique_ptr<Object>> matrix_0(rows * cols);
std::向量矩阵_0(行*cols);
所有的向量
都是一个指向的指针和一对其他指针,用于标记结束和最后使用的位置。访问数据数组与访问使用new
创建的动态数组没有什么不同。使用索引运算符[]
编译为数据指针+索引
,与在数组上使用[]
完全相同。没有Java的Vector中的同步或类似功能。这只是简单的原始数学
与动态数组相比,一个预先分配的
向量
消耗的内存只相当于两个指针,而作为回报,您几乎没有可能看到的内存管理问题。在将指针设置为NULL
之前,您应该先删除它们。删除列中的每个指针后,您可以删除[]
行并将其设置为NULL
,因为每个元素都被删除并消失了。std::vector\u of_objects
你注意的是2D对象数组还是2D指针数组?@R Sahu:这是指向基类对象的2D指针数组,设置这种数组是为了利用各种细胞自动机派生对象的多态行为。@Chris矩阵0[i]数据的分配在哪里?您甚至没有正确地进行分配(或者充其量是不完整的)。另外,如果数组在设置后没有改变形状,这在效率方面会好得多:只需使用Base*
作为数据类型。@Paul,是的,你是对的,我省略了这一部分,因为对象本身有一个单独的内存分配任务,并且似乎与这个问题无关。是的,很可怕,但有人告诉我,出于“速度”的考虑,这是必要的。感谢您的提示和正确(测试)答案。如果在构建向量时保留足够的空间,则此与std::vector
之间的速度差可能介于“不可检测”和“可忽略”之间。