更新:C ++指针代码段

时间:2009-02-15 02:58:05

标签: c++ pointers

再次问候,再次感谢为第一个问题提供答案的所有人。更新以下代码以包含每个赋值的两个函数。

要查看原始问题,请点击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”运算符为此二维数组取消分配内存。您应该首先删除每一行(一个整数数组),然后删除指针数组。

4 个答案:

答案 0 :(得分:4)

代码看起来不错。

但是,对于我们人类来说,您可能想要解决一些问题:

  1. 您的函数签名(声明)缺少参数名称。更合适:

    int** createArray(int rows, int columns);
    void deleteArray(int** array, int rows);
    
  2. 您的功能名称对于真正创建/删除的内容并不具有描述性。例如,create2DArray将是一个更明智的选择。

  3. 你的变量的n前缀会伤害我的眼睛。 numRowsrowCount更具可读性。
  4. 同样,ppInt很疯狂。请尝试array(对于nPointer,以保持一致性)。 (可悲的是,你不能写2dArray。)
  5. 使用i作为循环计数器比nCount或类似(尤其是数组索引)更常见。我建议你改用它。
  6. 为了您的个人实践,有些事情超越并超越:

    1. 创建一个以rowscols作为其构造函数参数的类。确保自动解除分配数组。
    2. 使用std::vector并为您的班级创建resize成员函数。 请注意,这与原始问题不同,后者要求提供指示。
    3. 创建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 **”以强调你传递指针的事实)以保持一致性。

另外,在原型中包含参数名称。