作者indept (真人)
看板C_and_CPP
標題[問題] C++ 釋放陣列的問題
時間Fri Feb 20 07:05:30 2009
我試圖宣告並釋放一個簡單的二維陣列,
在呼叫 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