作者EdisonX (閉上眼的魚)
看板C_and_CPP
標題[問題] vector 與 new 之釋放問題
時間Mon Jan 10 23:22:59 2011
問題(Question):
1. 使用 new、vector , 不確定會不會有 memory leak 問題
2. 使用 new 失敗時該怎麼抓?使用 vector 失敗時又該怎麼抓?
程式碼(Code): (請善用置底文標色功能)
/* ------- vector -------- */
vector<vector<int>> arr; // arr[ROW][COL]
arr.clear();
arr.resize(ROW);
for(i=0; i<ROW; i++)
arr[i].resize(COL); // -------> 配失敗的話要怎麼抓?
// do something
arr.clean(); // -------> 會不會只有清一層而已?
/* ------- new -------- */
int ***a = new int**[x];
for(i=0; i<x; i++) {
a[i]=new int*[y];
for(j=0; j<y; j++){
a[i][j] = new int[z]; // -------> 配失敗的話要怎麼抓?
}
}
delete [] a; // -------> 這裡是三層全清嗎?
補充說明(Supplement):
1.
一維的都好辦,但二維以上就不是很清楚,
而 memory leak 又不會抓,
請問這麼做會不會有 memory leak 問題?
還是要像 C language 一層一層去 free?
2.
近來處理幾四、五千筆資料,如果單純讀進、讀出的話是沒問題
但如果用 string* pid = new string[DATA_CNT] 反而讀不出來
(當然不只這個 pointer, 還有其它 pointer, 扣除 string 部份
其餘基本的也才吃
4000 * 8bytes(double) * 5(5個double) = 160k
所以在想是不是 string 那裡用 new 的不適合?
就吃的空間而言,改用 char buffer[DATA_CNT][LEN] 會好些嗎?
謝謝大家的協助, 小弟感激不盡 !!!!
--
If there is no tomorrow,
I want to see u last time.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.142
※ 編輯: EdisonX 來自: 180.177.76.142 (01/10 23:28)
推 legnaleurc:你的第二段用法就會 leak, 每層 pointer 都要跑一層 01/10 23:29
→ legnaleurc:迴圈讓它 delete [] 01/10 23:29
→ legnaleurc:第一段的 vector 不用管它,你根本沒用 new 01/10 23:30
→ legnaleurc:vector 內部的事讓它自己處理,失敗它會丟 01/10 23:31
→ legnaleurc:std::bad_alloc 01/10 23:31
謝謝 l 大說明,
請教 new 那裡是這麼做的嗎?
for(i=0; i<x; i++){
for(j=0; j<y; j++) delete [] a[i][j];
delete [] a[i];
}
delete [] a;
再次感謝。
※ 編輯: EdisonX 來自: 180.177.76.142 (01/10 23:37)
→ akasan:說到 mem leak 的話一定要去看看神奇的 valgrind 怎麼用 01/11 00:00
→ EdisonX: 樓上 A 大,謝謝您提的好東西 !!! 01/11 00:02
推 tomap41017:new 跟後來的delete程式碼應該是正確的唷!!至於 01/13 00:40
→ tomap41017:vector.clear()就把它當成是三層都清空就好QQ 01/13 00:40
→ EdisonX:非常感謝 t 大指教,感激不盡! 01/13 01:36
※ 編輯: EdisonX 來自: 180.177.76.161 (05/12 00:51)