删除 3D 矩阵 c++
Posted
技术标签:
【中文标题】删除 3D 矩阵 c++【英文标题】:Delete 3D matrix c++ 【发布时间】:2015-02-19 16:34:11 【问题描述】:我正在尝试删除以“新”创建的矩阵,但编译器返回错误消息: “CRT 检测到应用程序在堆缓冲区结束后写入内存。”
这是我的代码:
//alloc
rede->y = new float**[rede->p];
for (i=0; i < rede->p; i++)
rede->y[i] = new float*[rede->c];
for (j=0; j < rede->c; j++)
rede->y[i][j] = new float [rede->n[i] + 1];
//...
//d-lloc
for (i=0; i < rede->p; i++)
for (j=0; j < rede->c; j++)
delete (rede->y[i][j]); //here is the error. If I comment this line, the compiler do not accuse any error.
delete (rede->y[i]);
delete (rede->y);
当我尝试这种方式时不会出错:
rede->y = new float**[rede->p];
for (i=0; i < rede->p; i++)
rede->y[i] = new float*[rede->c];
for (j=0; j < rede->c; j++)
rede->y[i][j] = new float [rede->n[i] + 1];
delete (rede->y[i][j]);
delete (rede->y[i]);
delete (rede->y);
第一个代码有什么问题? 谢谢。
【问题讨论】:
delete (rede->y);
delete
的格式错误。你分配了一个数组,所以你需要delete[]
。
另外,从您的帖子中删除那些...
并发布一个完整的程序,该程序什么都不做除了分配然后解除分配。如果没有问题,则违规代码在您发布的...
中。
这个版本没有显示错误:ideone.com/YoXnsi
【参考方案1】:
尽管我不提倡使用float***
(三星级编程),但我会尝试为您提供有关您发布的代码的信息。请注意,使用容器类可能会更好,例如 std::vector<std::vector<float>>
。
我看到的一个错误是您没有使用正确的delete
形式。由于您分配了一个数组,因此您应该使用delete[]
。即使您只是分配指针或float
,使用错误形式的delete
也是未定义的行为。
其次,我们不知道rede->p
、rede->c
或rede->n
的值是什么,因此我们不知道问题是否出在这些变量中。
第三,您的帖子正在使用分配的内存做一些事情,但您没有向我们展示。可能是您未显示的代码导致内存损坏 - 您应该检查一下。
举个例子,这是一个正确编译和释放的程序。
int main()
const int nPages = 5;
const int nRows = 10;
const int nCols = 20;
float ***mat = new float**[nPages];
for (int i = 0; i < nPages; i++)
mat[i] = new float*[nRows];
for (int j = 0; j < nRows; j++)
mat[i][j] = new float[nCols];
for (int i = 0; i < nPages; i++)
for (int j = 0; j < nRows; j++)
delete [] mat[i][j];
delete [] mat[i];
delete[] mat;
注意delete[]
的正确用法。
鉴于此,如果矩阵的维度是固定的,那么以下版本会减少对new[]
的调用次数,从而使delete[]
更容易处理:
int main()
const int nPages = 5;
const int nRows = 10;
const int nCols = 20;
float ***mat = new float**[nPages];
for (int i = 0; i < nPages; i++)
mat[i] = new float*[nRows];
float *pool = new float[nRows * nCols];
for (int j = 0; j < nRows; j++, pool+=nCols)
mat[i][j] = pool;
for (int i = 0; i < nPages; i++)
delete [] mat[i][0];
delete [] mat[i];
delete[] mat;
在第一个示例中,对 new[]
的调用总计 56 次。第二个示例只有 11 次调用 new[]
。这两个示例都完成了同样的事情,但使用的内存分配方式略有不同。第二个版本在一次调用中将所有数据分配给new[]
,而不是为每一行数据调用new[]
。
另请注意,如果列数(最内层维度)增加,则第一个示例中对 new[]
的调用次数将显着增加,因为最内层循环必须调用 new[]
,而在第二种情况下,对new[]
的调用保持在 11,无论最内层循环是否增加。
第二个例子中对delete[]
的调用也不同,我们只需要删除mat[i][0]
就可以删除一整页数据,而不必循环删除每一行数据。
【讨论】:
以上是关于删除 3D 矩阵 c++的主要内容,如果未能解决你的问题,请参考以下文章