看板 C_and_CPP 關於我們 聯絡資訊
問題(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)