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