cat
是不是被返回給此函數的調用者。當您執行cat = longcat
時,您只更改本地副本。
這意味着您傳遞給此函數的參數仍然指向您非常不方便刪除的舊地址。
要麼通過它作爲參考或做舊C雙指針技巧,並通過其地址。
您可能還需要確保你第一次調用該方法,cat
有一個有效值和size
和looong
兼容(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
,你在一個痛苦的世界,通常被稱爲未定義的行爲。
通過將第一個參數引用類型,在功能上作出變化反映早在中傳遞變量。
-1請保持4chan的上4chan的。 (如果你要嘗試,至少不要成爲新的......) – GManNickG 2011-01-20 06:28:21
難道你不知道規則1和2嗎? – 2011-01-20 07:07:25
這基本上是使用C++的規則 - 每一行都是壓路機。 – ActiveTrayPrntrTagDataStrDrvr 2012-06-21 15:06:09