2009-02-15 51 views
1

再次問候,再次感謝提供第一個問題答案的所有人。下面的代碼被更新以包含每個賦值的兩個函數。更新:C++指針代碼片段

要查看原始問題,請單擊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整型數組的指針。 (2)設計和實現一個函數來爲這個二維數組取消分配內存:函數應該有兩個參數(一個指針指向一個二維整數數組,另一個指針指向一個二維整數數組,另一個指針指向一個二維整數數組,數組中的行數)。在函數中,你應該使用「delete」操作符爲這個2-D數組取消分配內存。您應該首先刪除每行(整數數組),然後刪除指針數組。

回答

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或類似(尤其是數組索引)更常見。我建議你使用它。

有些東西和超越,爲您的個人做法:

  1. 創建一個類需要rowscols作爲參數傳遞給它的構造。確保自動釋放陣列。
  2. 使用std::vector併爲您的類創建resize成員函數。 請注意,這偏離了原來的問題,要求提供指針。
  3. 創建copy函數和clone函數將數據複製到另一個2D數組(可能具有不同的大小!)或克隆現有數組。
+0

「創建複製函數以將數據複製到另一個2D陣列」複製構造函數有什麼問題? – 2009-02-15 05:03:52

+0

從未提及:)我認爲你的意思是2個功能,然後沒有建議之前的類:) – 2009-02-15 05:06:03

0

對我來說看起來很合理。

雖然我不確定是否提交了一個全新的問題。對原文的修改可能會更好。

+0

感謝您的意見。如果第二個問題不合適,我很抱歉;我沒有看到修改我原來的問題的選項。下次我會記住這一點。再次感謝你。保重。 – ninj0rc 2009-02-15 03:15:36

+0

我想我應該編輯原文。我再一次道歉,並非常感謝你看看代碼。 – ninj0rc 2009-02-15 03:19:16

0

對於「deleteArray」,原型和定義是不完全一樣:

void deleteArray(int*[], int); 
void deleteArray(int** nPointer, int nRows) 

他們有相同的意義,但爲了清楚起見,我認爲這將是最好的讓他們完全(贊成`int **'來強調你傳遞指針的事實)以保持一致性。

另外,在原型中包含參數名稱。它確定。

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時失敗了。然後你從ALLOC 1和前三次調用ALLOC 2泄漏內存。現在在你的情況下代碼是如此微不足道,可能並不重要。但是在編寫C++代碼時,您應該始終記住這一點。

如果發生異常,會發生什麼情況,哪些資源將被泄漏哪些資源不會被正確清理。

我認爲你應該考慮把你的二維數組封裝在一個類中,這樣你可以保證即使存在異常也能正確分配和解除分配。