作者jackwei (吐司)
看板C_and_CPP
標題[問題] 有關 new 和 delete
時間Sat Sep 18 11:49:12 2010
遇到的問題: (題意請描述清楚)
我目前需要使用一個 function 來修改某個陣列的長度及內容
例如:
void change(int *a, int &length)
{
delete [] a;
length += 2;
a = new int [length];
for(int i=0;i<length;i++) a[i] = i+1;
}
//把陣列的長度加 2
int main()
{
int length = 3;
int *a = new int [length];
for(int i=0;i<length;i++) a[i] = i+1;
change(a, length);
for(int i=0;i<length;i++) cout<<a[i]<<" ";
cout<<endl; //應該印出 1 2 3 4 5
change(a, length); //再一次
for(int i=0;i<length;i++)cout<<a[i]<<" ";
//應該印出 1 2 3 4 5 6 7
delete [] a;
return 0;
}
上面這個例子的確有跑出預想的結果
但是實際的大程式卻會出問題
而且還是很怪的問題:
陣列 a 的內容在被傳入 change() 一次之後內容沒錯
但是將陣列 a 第二次傳入 change() 之後
回到 main() 以後, a[0] a[1] ... 都變成垃圾值
如果以上的寫法沒有什麼隱藏問題
那我就朝其他方向 debug 了 orz
謝謝各位
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
dev-c++
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.43.22
※ 編輯: jackwei 來自: 118.160.43.22 (09/18 11:49)
→ LPH66:你沒把你 new 出來的 a 給送回去 09/18 11:57
→ LPH66:注意這裡的 a 是 call by value (of the addr of an array) 09/18 11:57
推 nowar100:我決定這幾天加入第十三誡 這問題也被問到快爛了 XD 09/18 12:05
※ 編輯: jackwei 來自: 118.160.43.22 (09/18 12:14)
推 wu110011:那為什麼第一次可以成功呼叫? 09/18 12:15
→ jackwei:上面提供的程式碼 第幾次好像都會對耶 09/18 12:25
推 littleshan:因為運氣好的話delete後再new可能會得到一樣的位址 09/18 12:30
→ jackwei:謝謝 好像知道原理了 那應該用什麼方法達到這個目的呢 09/18 12:49
→ proLIONS:you should use **a instead of *a 09/18 12:50
→ proLIONS:you may think of **a as something like *a[] 09/18 12:51
→ james732:這個真的很容易錯...XD 09/18 14:57
→ tinlans:一般這種函式設計還是會傳回一個 pointer 吧。 09/18 15:44
推 LPH66:所以我一樓推的是"送回去" 藉參數列或回傳值送回去兩者皆可 09/18 16:12
推 yayarice:我都是在function input寫double& *a耶 09/19 20:42