2016-05-23 22 views
0

我是一名學生,是C++的初學者,在課上我們正在練習指針,動態數組和函數。我寫了一個沒有錯誤的程序,並做了它必須做的事情。我的問題是它沒有刪除動態數組。 我們被要求把刪除[]功能函數可以在不刪除動態數組的情況下工作。程序工作並且沒有錯誤

#include <iostream> 
using namespace std; 

char* Function (char c[], int numbers[]){ 
    int k=0; 

    for (int i=0; i< 4;i++){ 
     k+=numbers[i]; 
    } 

    k++; 
    char *result = new char[k]; 
    char *counter=result; 

    for (int i=0; c[i]!='\0';i++) 
    { 
     int index = numbers[i]; 

     for (int j=0; j< index; j++) 
     { 
      *counter=c[i]; 
      counter=counter+1; 
     } 
    } 

    *counter='\0'; 

    return result; 

} 

int main() 
{ 
    char c[]="abcd"; 
    int numbers []={1,2,3,4}; 
    char d[]="ghj"; 
    int numbersx []={2,1,1}; 

    cout << Function(c,numbers); 
    cout << Function(d,numbersx); 

    return 0; 
} 

這是我不清楚其中刪除[]將被定位在這種情況下里面。 我已經搜了this recommends that i put the delete inside main 其他回答不回答我的確切問題。

+0

建議作爲一個很好的做法。它的小陣列的情況下,它沒有任何區別;但是對於大型陣列,您需要使用它來釋放內存。 –

+0

噢好吧,我不知道應該在哪裏放置刪除 – Igna

+0

它通常放在最後,當你不再需要數組。 –

回答

0

可以在函數中刪除它。只是不要釋放/刪除它。您也可以在main()中刪除它。

如果你不刪除它,你就沒有可見的問題(編譯器贏了'抱怨,程序也不會崩潰)。然而,你會有內存泄漏,而這絕對不是你想要的。

0

我的問題是,它的工作原理沒有刪除動態數組。

它可能工作...但它也泄漏內存。內存泄漏在沒有無限內存的計算機上是一件壞事。

我不清楚在這種情況下delete []的位置。

必須定位,使尖銳的物體是從來沒有使用它已被刪除後。 這裏使用表示通過取消引用指向它的指針來訪問對象的內存。

如果我把它放在返回後它仍然會被刪除?

如果您的意思是它在Function但在返回後,當然不是。返回後,函數中沒有任何內容被執行。

它必須放在功能,而不是主要。

如果您要在Function中刪除,那麼您將返回一個指向已刪除對象的指針,這將非常糟糕。我建議放棄這個愚蠢的要求。

技術上,main從未取消引用指針,所以該計劃將在技術上仍具有明確定義的行爲,即使你在Function刪除,即使返回值將被完全無用。

+0

'main'確實使用指針,因爲它將它發送到'cout' –

+0

@KarstenKoop正確。 – user2079303

0

如果你沒有釋放內存,你將最終與內存泄漏。對於這樣簡單的應用程序,你不會看到問題。對於在應用程序退出之前分配大量數據的較大/較長時間運行的應用程序,最終會導致內存不足,並且程序將崩潰並且/或者操作系統將數據緩存到磁盤時緩慢進行爬網。

釋放內存,但仍然打印一些輸出,你需要這樣的事:

#include <iostream> 
using namespace std; 

void Function (char c[], int numbers[]){ 
    int k=0; 

    for (int i=0; i< 4;i++){ 
     k+=numbers[i]; 
    } 

    k++; 
    char *result = new char[k]; 
    char *counter=result; 

    for (int i=0; c[i]!='\0';i++) 
    { 
     int index = numbers[i]; 

     for (int j=0; j< index; j++) 
     { 
      *counter=c[i]; 
      counter=counter+1; 
     } 
    } 

    *counter='\0'; 

    cout << result; 

    delete [] result; 
} 

int main() 
{ 
    char c[]="abcd"; 
    int numbers []={1,2,3,4}; 
    char d[]="ghj"; 
    int numbersx []={2,1,1}; 

    Function(c,numbers); 
    Function(d,numbersx); 

    return 0; 
} 

這是你能得到你的函數裏面的delete[]因爲其他人所說的唯一方法,你仍然需要訪問內存在函數返回後報告結果。

另一種方法是在main方法調用delete []兩次如下:

#include <iostream> 
using namespace std; 

char* Function (char c[], int numbers[]){ 
    int k=0; 

    for (int i=0; i< 4;i++){ 
     k+=numbers[i]; 
    } 

    k++; 
    char *result = new char[k]; 
    char *counter=result; 

    for (int i=0; c[i]!='\0';i++) 
    { 
     int index = numbers[i]; 

     for (int j=0; j< index; j++) 
     { 
      *counter=c[i]; 
      counter=counter+1; 
     } 
    } 

    *counter='\0'; 

    return result; 
} 

int main() 
{ 
    char c[]="abcd"; 
    int numbers []={1,2,3,4}; 
    char d[]="ghj"; 
    int numbersx []={2,1,1}; 

    char* result = Function(c,numbers); 
    cout << result; 
    delete[] result; 

    result = Function(d,numbers); 
    cout << result; 
    delete[] result; 

    return 0; 
} 
+0

@Igna:看看代碼的這一部分「釋放內存,但仍然打印一些輸出,你需要這樣的東西」。你的老師可能會期待這一點。 – sameerkn

相關問題