【问题标题】:Correctly deleting the pointers of a 3D matrix正确删除 3D 矩阵的指针
【发布时间】:2018-08-15 23:29:37
【问题描述】:

我编写了一个程序来创建一个 3D 矩阵(或多维矩阵),其中所有参数(行、列,都是可变的)。我正在使用的矩阵类型如下所示:

程序按预期运行。但我不知道删除指针是否正确释放了内存。我是否正确删除了指针?

#include <iostream>

using namespace std;

int main()
{
    int  vol;                   
    cout << "enter number of 2d arrays(vol value)" <<endl;
    cin >> vol;
    int row[10];
    cout<< "enter number of rows in each vol" << endl;
    for (int i = 0; i < vol ; i++)
    {
        cin >> row[i];
    }

    //================ Entering col for each rown in each vol  ================//
    int **col;
    col = new int *[vol];

    for (int i = 0; i < vol ; i++)
    {
        *(col+i) = new int [row[i]];
        for (int j = 0; j < row[i] ; j++)
        {
            cout<< "enter columns of " << j << "th row " <<" of vol " << i  <<" :  ";
            cin>>*(*(col+i)+j);
        }

    }

    //======= Printing the value of each col for each rown in each vol =======//
    cout<< "entered values are \n \n" << endl;

    for (int i = 0; i < vol; i++)
    {
        for (int j = 0; j < row[i]; j++)
        {
            cout<< *(*(col + i) + j);
            cout << "\t";
        }

        cout<< "\n" << endl;
    }

    //========================Creation of 3d matrix===========================//
    int ***p;

    p = new int **[vol];            //creating number of vol
    for (int i = 0; i < vol ; i++)  //creating rows for each vol
    {
        *(p + i) = new int *[row[i]];
    }

    for (int j = 0; j < vol ; j++)  //creating 1d array for each row
    {
        for (int k = 0; k < row[j] ; k++)
        {
            *(*(p + j) + k) = new int [*(*(col + j) + k)];
        }
    }

    //============Entering all the values in the 3d variable matrix===========//
    cout<< "entering elements into 3d matrix" << endl;
    cout << "enter all the values \n \n" << endl;
    for (int i = 0; i < vol ; i++)
    {
        for (int j = 0; j < row[i] ; j++)
        {
            for (int k = 0; k < *(*(col + i) + j) ; k++)
            {
                cout<< "enter the value in col " <<k <<", of row " << j<< ", of vol " << i << " : "<< endl;
                cin >> *(*(*(p + i) + j) + k);
            }
        }
    }

    //============Printing all the values in the 3d variable matrix===========//
    cout<< "Lets print all the values in 3d matrix \n\n" << endl;
    for (int i = 0; i < vol; i++)
    {
        for (int j = 0; j < row[i]; j++)
        {
            for (int k = 0; k < *(*(col + i) + j); k++)
            {
                cout<< *(*(*(p + i) + j) + k);
                cout << "\t";
            }

            cout<< " \n" << endl;
        }

        cout<< "\n\n============================" << endl;
    }

    //======================= deleting all pointers ========================//

    //Deleting the col pointer
    for (int i = 0; i < vol ; i++)
    {
        delete[] col[i];
    }

    delete[] col;

    //Deleting the p pointer
    for (int i = 0; i < vol ; i++)
    {
        for (int j = 0; j < row[vol] ; j++)
        {
            delete[] p[j];          //deleting the last arrays
        }
        delete[] p[i];
    }
    delete []p;

    system("pause");
    return 0;
}

【问题讨论】:

  • 快速健全性检查显示您的newdeletes 匹配(相同的数字,都使用[] 表单)。最好的办法是通过泄漏检测器(例如,valgrind)运行您的程序,因为这会给您一个明确的答案。
  • 您真正想要的是智能指针。去搜索 std::unique_ptr 和 std::shared_ptr;那么你所有的删除都可以......删除
  • 顺便说一句:你不妨把它放在姐妹网站codereview.stackexchange.com 以获得关于你的风格的反馈
  • 您在此处查找的术语是 array,而不是矩阵。
  • 当它达到这个级别的数组索引时,我倾向于将它放入一个平面数组中并添加带有适当索引的 get/set 来完成我的工作。我讨厌这样的多级分配。容易出错且浪费。

标签: c++ pointers matrix dynamic-memory-allocation


【解决方案1】:

你必须像尊重创造的方式一样尊重删除的方式,这样你才能做到:

//Deleting the p pointer
for ( int i = 0; i < vol ; i++){
    for (int j = 0; j < row[vol] ; j++)
        delete[] p[i][j];
    delete[] p[i];
}

delete[] p;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多