看板 C_and_CPP 關於我們 聯絡資訊
我試圖宣告並釋放一個簡單的二維陣列, 在呼叫 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
ledia:這要看 memory management 的程式庫是怎麼實作的 02/20 10:15
ledia:有可能在 alloc 比較小的時候他會留一些下來不每次 free 02/20 10:15
ledia:可以供小額使用時的 buffer, 在頻繁操作下速度會比較快 02/20 10:16
ledia:如果 size 超過他設定的臨界值才會同步還回給作業系統 02/20 10:16
ledia:一般實作都有類似的設計, 真正怎麼實作就要看看 malloc/free 02/20 10:17
ledia:的原始碼了 02/20 10:17