[問題] vector 與 new 之釋放問題

看板C_and_CPP (C/C++)作者 (閉上眼的魚)時間15年前 (2011/01/10 23:23), 編輯推噓2(208)
留言10則, 4人參與, 最新討論串1/1
問題(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)

01/10 23:29, , 1F
你的第二段用法就會 leak, 每層 pointer 都要跑一層
01/10 23:29, 1F

01/10 23:29, , 2F
迴圈讓它 delete []
01/10 23:29, 2F

01/10 23:30, , 3F
第一段的 vector 不用管它,你根本沒用 new
01/10 23:30, 3F

01/10 23:31, , 4F
vector 內部的事讓它自己處理,失敗它會丟
01/10 23:31, 4F

01/10 23:31, , 5F
std::bad_alloc
01/10 23:31, 5F
謝謝 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)

01/11 00:00, , 6F
說到 mem leak 的話一定要去看看神奇的 valgrind 怎麼用
01/11 00:00, 6F

01/11 00:02, , 7F
樓上 A 大,謝謝您提的好東西 !!!
01/11 00:02, 7F

01/13 00:40, , 8F
new 跟後來的delete程式碼應該是正確的唷!!至於
01/13 00:40, 8F

01/13 00:40, , 9F
vector.clear()就把它當成是三層都清空就好QQ
01/13 00:40, 9F

01/13 01:36, , 10F
非常感謝 t 大指教,感激不盡!
01/13 01:36, 10F
※ 編輯: EdisonX 來自: 180.177.76.161 (05/12 00:51)
文章代碼(AID): #1DAoHP7Y (C_and_CPP)
文章代碼(AID): #1DAoHP7Y (C_and_CPP)