[問題] 有關 new 和 delete

看板C_and_CPP作者 (吐司)時間15年前 (2010/09/18 11:49), 編輯推噓5(508)
留言13則, 9人參與, 最新討論串1/2 (看更多)
遇到的問題: (題意請描述清楚) 我目前需要使用一個 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)

09/18 11:57, , 1F
你沒把你 new 出來的 a 給送回去
09/18 11:57, 1F

09/18 11:57, , 2F
注意這裡的 a 是 call by value (of the addr of an array)
09/18 11:57, 2F

09/18 12:05, , 3F
我決定這幾天加入第十三誡 這問題也被問到快爛了 XD
09/18 12:05, 3F
※ 編輯: jackwei 來自: 118.160.43.22 (09/18 12:14)

09/18 12:15, , 4F
那為什麼第一次可以成功呼叫?
09/18 12:15, 4F

09/18 12:25, , 5F
上面提供的程式碼 第幾次好像都會對耶
09/18 12:25, 5F

09/18 12:30, , 6F
因為運氣好的話delete後再new可能會得到一樣的位址
09/18 12:30, 6F

09/18 12:49, , 7F
謝謝 好像知道原理了 那應該用什麼方法達到這個目的呢
09/18 12:49, 7F

09/18 12:50, , 8F
you should use **a instead of *a
09/18 12:50, 8F

09/18 12:51, , 9F
you may think of **a as something like *a[]
09/18 12:51, 9F

09/18 14:57, , 10F
這個真的很容易錯...XD
09/18 14:57, 10F

09/18 15:44, , 11F
一般這種函式設計還是會傳回一個 pointer 吧。
09/18 15:44, 11F

09/18 16:12, , 12F
所以我一樓推的是"送回去" 藉參數列或回傳值送回去兩者皆可
09/18 16:12, 12F

09/19 20:42, , 13F
我都是在function input寫double& *a耶
09/19 20:42, 13F
文章代碼(AID): #1Cb3QwN9 (C_and_CPP)
文章代碼(AID): #1Cb3QwN9 (C_and_CPP)