您需要执行大量删除操作:
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;
没有必要NULL
除了matrix_0
因为删除后它们就消失了。
这是可怕且不必要的。Use a std::vector http://en.cppreference.com/w/cpp/container/vector并认真重新考虑指向所包含对象的指针。
std::vector<std::vector<Object*>> matrix_0(rows, std::vector<Object*>(cols));
得到你想要的并将删除工作减少到
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
delete matrix_0[i][j]; // delete stored pointer
}
}
但是SergeyA的存储建议unique_ptr
, std::vector<std::vector<std::unique_ptr<Object>>> matrix_0;
将所需的删除减少到0。
由于速度是 OP 的目标之一,因此还有一项改进:
std::vector<std::unique_ptr<Object>> matrix_0(rows * cols);
访问权限是
matrix_0[row * cols + col];
这用一些可见的数学来换取当前在幕后进行的不可见的数学和指针取消引用。重要的是向量现在存储为一个很好的连续内存块,增加了空间局部性并减少了缓存未命中的数量。它无助于解决因指向的指针而导致的未命中Objects
分散在记忆中,但你不可能总是赢。
注释vector
与数组。一旦vector
已经建成,在本例中,这一切都在这里一次性完成:
std::vector<std::unique_ptr<Object>> matrix_0(rows * cols);
all a vector
is 是一个指向 an 的指针,还有几个其他指针来标记结束和最后使用的位置的位置。访问数据数组与访问由以下命令创建的动态数组没有什么不同new
。使用索引运算符[]
编译为data_pointer + index
与使用完全相同[]
在一个数组上。没有像 Java 的 Vector 中那样进行同步或类似操作。这只是简单的原始数学。
与动态数组相比,所有预分配的vector
花费你两个指针的内存,作为回报,你几乎不会遇到任何内存管理问题。