2011-01-20 44 views
0
void longcatislong(int* cat, int &size, int &looong) 
{ 
    int* longcat = new int[looong*2]; 
    for(int i = 0; i < size; i = i + 1) 
     longcat[i] = cat[i]; 
    delete [] cat; 
    cat = longcat; 
    looong = looong * 2; 
} 

湯傢伙。我/ r/equesting一些幫助與我有我的代碼的這個問題。顯然,我的C++代碼中的某些內容導致了堆損壞錯誤,並且是delete[] cat。 cat是一個由new運算符和一個指針創建的動態數組。那麼爲什麼當我使用數組刪除時,整個程序決定在壓路機下崩潰,並說我得到了堆腐敗。我12歲,這是什麼?堆損壞?在我的動態記憶?

+6

-1請保持4chan的上4chan的。 (如果你要嘗試,至少不要成爲新的......) – GManNickG 2011-01-20 06:28:21

+0

難道你不知道規則1和2嗎? – 2011-01-20 07:07:25

+0

這基本上是使用C++的規則 - 每一行都是壓路機。 – ActiveTrayPrntrTagDataStrDrvr 2012-06-21 15:06:09

回答

3

您按值傳遞cat指針,所以無論您在函數內部做了哪些更改都不會反映到外部。您需要通過引用傳遞指針,如int*& cat

1

cat不是被返回給此函數的調用者。當您執行cat = longcat時,您只更改本地副本。

這意味着您傳遞給此函數的參數仍然指向您非常不方便刪除的舊地址。

要麼通過它作爲參考或做舊C雙指針技巧,並通過其地址。

您可能還需要確保你第一次調用該方法,cat有一個有效值和sizelooong兼容(looong * 2 >= size)免得破壞內存。

看一看下面的代碼說明您的問題:

#include <iostream> 
void longcatislong1(int* cat, int &size, int &looong) 
{ 
    int* longcat = new int[looong*2]; 
    for(int i = 0; i < size; i = i + 1) 
     longcat[i] = cat[i]; 
    delete [] cat; 
    cat = longcat; 
    looong = looong * 2; 
} 

void longcatislong2(int*& cat, int &size, int &looong) 
{ 
    int* longcat = new int[looong*2]; 
    for(int i = 0; i < size; i = i + 1) 
     longcat[i] = cat[i]; 
    delete [] cat; 
    cat = longcat; 
    looong = looong * 2; 
} 

int main (void) { 
    int sz = 0; 
    int lng = 10; 
    int *ct = 0; 
    std::cout << ct << std::endl; 
    longcatislong1 (ct, sz, lng); 
    std::cout << ct << std::endl; 
    longcatislong2 (ct, sz, lng); 
    std::cout << ct << std::endl; 
    return 0; 
} 

它的輸出是:

0 
0 
0x9c83060 

這意味着longcatislong1呼叫沒有成功設置ct上的回報。 longcatislong2功能,它將指針作爲參考,確實設置ct正確。


假設您有一個指向0xf0000000的有效指針。當您調用原始函數時,會分配一個新的內存塊,數據將被複制並刪除舊的塊。

ct變量仍然指向舊塊。

下一個當你調用該函數,或者即使你在其他地方解除ct,你在一個痛苦的世界,通常被稱爲未定義的行爲。

通過將第一個參數引用類型,在功能上作出變化反映早在中傳遞變量。

0

您應該刪除INT *通過INT貓**貓函數參數,然後即使在cat [i]的位置上,也可以通過* cat替換功能體中的所有貓插入 。

void longcatislong(int** cat, int &size, int &looong) 
{ 
    int* longcat = new int[looong*2]; 
    for(int i = 0; i < size; i = i + 1) 
     longcat[i] = *cat[i]; 
    delete [] *cat; 
    *cat = longcat; 
    looong = looong * 2; 
} 

然後當你調用函數調用它像:

longcatislong(&cat, size, looong);