再次问候,再次感谢为第一个问题提供答案的所有人。更新以下代码以包含每个赋值的两个函数。
要查看原始问题,请点击here。
我非常确保这符合作业的要求,但我再次非常感谢任何帮助。我是否适当修改了删除语句?再次感谢。
#include<iostream>
#include<string>
int** createArray(int, int);
void deleteArray(int*[], int);
using namespace std;
int main()
{
int nRows;
int nColumns;
cout<<"Number of rows: ";
cin>>nRows;
cout<<"Number of columns: ";
cin>>nColumns;
int** ppInt = createArray(nRows, nColumns);
deleteArray(ppInt, nRows);
}
int** createArray(int nRows, int nColumns)
{
int** ppInt = new int*[nRows];
for (int nCount = 0; nCount < nRows; nCount++)
{
ppInt[nCount] = new int[nColumns];
}
return ppInt;
}
void deleteArray(int** nPointer, int nRows)
{
for (int nCount = 0; nCount < nRows; nCount++)
{
delete[] nPointer[nCount];
}
delete[] nPointer;
}
P.S。这是分配文档本身,以防它有用:
(1)设计并实现一个为2-D整数数组分配内存的函数:该函数应该将两个整数作为参数,一个用于行数,一个用于列数。您需要在此功能中使用“new”运算符。请记住,我们需要首先创建一个指针数组。然后,对于该数组中的每个指针,我们需要创建一个整数数组。该函数应该返回一个指向2-D整数数组的指针。
(2)设计并实现一个为这个2-D数组解除分配内存的函数:该函数应该有两个参数(一个指向二维整数数组的指针,另一个是数字数组中的行数)。在该函数中,您应该使用“delete”运算符为此二维数组取消分配内存。您应该首先删除每一行(一个整数数组),然后删除指针数组。
答案 0 :(得分:4)
代码看起来不错。
但是,对于我们人类来说,您可能想要解决一些问题:
您的函数签名(声明)缺少参数名称。更合适:
int** createArray(int rows, int columns); void deleteArray(int** array, int rows);
您的功能名称对于真正创建/删除的内容并不具有描述性。例如,create2DArray
将是一个更明智的选择。
n
前缀会伤害我的眼睛。 numRows
或rowCount
更具可读性。ppInt
很疯狂。请尝试array
(对于nPointer
,以保持一致性)。 (可悲的是,你不能写2dArray
。)i
作为循环计数器比nCount
或类似(尤其是数组索引)更常见。我建议你改用它。为了您的个人实践,有些事情超越并超越:
rows
和cols
作为其构造函数参数的类。确保自动解除分配数组。std::vector
并为您的班级创建resize
成员函数。 请注意,这与原始问题不同,后者要求提供指示。 copy
函数和clone
函数,将数据复制到另一个2D数组(可能大小不同!)或克隆现有数组。答案 1 :(得分:1)
没关系。
问题在于您没有考虑代码中的异常安全性。
int** ppInt = new int*[nRows]; // ALLOC 1
for (int nCount = 0; nCount < nRows; nCount++)
{
ppInt[nCount] = new int[nColumns]; // ALLOC 2
}
说ALLOC 1没问题 但是如果ALLOC 2中的任何一个失败,那么你会遇到异常和严重的内存泄漏。
例如。
你在第四次调用ALLOC 2时失败了。然后你把内存从ALLOC 1和前三次调用泄漏到ALLOC 2.现在在你的情况下代码是如此微不足道,这可能无关紧要。但这是在编写C ++代码时应始终牢记的事情。
如果抛出异常,将会发生什么,将会泄漏哪些资源将无法正确清理哪些资源。
我认为您应该考虑将2D数组包装在一个类中,以便即使存在异常也可以保证正确分配和取消分配内存。
答案 2 :(得分:0)
对我来说看起来很合理。
但是,我不确定提交一个全新的问题。作为对原文的修正可能更好。答案 3 :(得分:0)
对于“deleteArray”,您的原型和定义并不完全相同:
void deleteArray(int*[], int);
void deleteArray(int** nPointer, int nRows)
它们具有相同的含义,但为了清楚起见,我认为最好让它们完全相同(支持“int **”以强调你传递指针的事实)以保持一致性。
另外,在原型中包含参数名称。