[問題] C++ 釋放陣列的問題

看板C_and_CPP (C/C++)作者 (真人)時間16年前 (2009/02/20 07:05), 編輯推噓1(105)
留言6則, 1人參與, 最新討論串1/1
我試圖宣告並釋放一個簡單的二維陣列, 在呼叫 func( 10000000,10 ); 的情況下記憶體似乎無法被釋放, 用 top 看如下 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 27342 aaaaaaa 20 0 461m 458m 920 R 100.0 22.7 0:09.85 b02.out 31753 root 20 0 261m 100m 8904 R 3.0 5.0 67:24.75 Xorg 32195 aaaaaaa 20 0 97608 34m 12m S 1.7 1.7 5:57.84 gnome-terminal 若選擇 func( 1000000,100 ) 則記憶體成功釋放, 27390 aaaaaaa 20 0 3396 1336 920 R 100.0 0.1 0:09.10 b02.out 31753 root 20 0 255m 94m 9096 S 2.0 4.7 67:28.05 Xorg 誰能告訴我是怎麼回事? 謝謝 // -------------- void everloop( const string &line ) { cout << "everloop( "+line+" ):\n"; int rvalue=0; for (;;) { rvalue = rand(); if ( rvalue < 0 ) break; } } void func( int length,int dimension ) { int **sources = new int*[ length ]; for ( int i=0;i<length;i++ ) { sources[i] = new int[ dimension ]; } for ( int i=0;i<length;i++ ) { delete [] sources[i]; } delete [] sources; } int main() { srand( time(0) ); func( 10000000,10 ); // func( 1000000,100 ); everloop( "main" ); } // ---------------- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 171.64.92.108

02/20 10:15, , 1F
這要看 memory management 的程式庫是怎麼實作的
02/20 10:15, 1F

02/20 10:15, , 2F
有可能在 alloc 比較小的時候他會留一些下來不每次 free
02/20 10:15, 2F

02/20 10:16, , 3F
可以供小額使用時的 buffer, 在頻繁操作下速度會比較快
02/20 10:16, 3F

02/20 10:16, , 4F
如果 size 超過他設定的臨界值才會同步還回給作業系統
02/20 10:16, 4F

02/20 10:17, , 5F
一般實作都有類似的設計, 真正怎麼實作就要看看 malloc/free
02/20 10:17, 5F

02/20 10:17, , 6F
的原始碼了
02/20 10:17, 6F
文章代碼(AID): #19dUMxPU (C_and_CPP)
文章代碼(AID): #19dUMxPU (C_and_CPP)