删除 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-&gt;y); delete 的格式错误。你分配了一个数组,所以你需要delete[] 另外,从您的帖子中删除那些... 并发布一个完整的程序,该程序什么都不做除了分配然后解除分配。如果没有问题,则违规代码在您发布的... 中。 这个版本没有显示错误:ideone.com/YoXnsi 【参考方案1】:

尽管我不提倡使用float***(三星级编程),但我会尝试为您提供有关您发布的代码的信息。请注意,使用容器类可能会更好,例如 std::vector&lt;std::vector&lt;float&gt;&gt;

我看到的一个错误是您没有使用正确的delete 形式。由于您分配了一个数组,因此您应该使用delete[]。即使您只是分配指针或float,使用错误形式的delete 也是未定义的行为。

其次,我们不知道rede-&gt;prede-&gt;crede-&gt;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++的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL矩阵乘法C++

如何删除 C++ 给定矩阵中的特定行和列?

如何在 C++ 中将一组整数转换为 3D 向量?

C++重载实现m*n*k三维矩阵,且矩阵元素为复数

在 3D 中组合旋转

在 C++ 中释放 2D 指针矩阵时崩溃