2009-08-11 1 views
3

다음과 같은 상황에서 GCC 런타임에서 어떤 일이 벌어지고 있는지 이해하고 싶습니다.C++에서 delete가 호출 되더라도 프로세스는 언제 할당 된 메모리를 유지합니까?

나는 많은 메모리 블록을 할당하고 삭제하는 C++ 프로그램을 가지고있다. 수수께끼 같은 것은 메모리가 GCC 런타임에 의해 OS로 반환되지 않는다는 것입니다. 대신, 그것은 여전히 ​​내 프로그램에 의해 유지되고있다, 나는 가까운 장래에 유사한 메모리 덩어리를 할당하려는 경우에 대비한다.

다음 프로그램은 어떻게되는지 보여줍니다

#include <iostream> 
using namespace std; 

void pause1() 
{ 
    cout << "press any key and enter to continue"; 
    char ch; 
    cin >> ch; 
} 

void allocate(int size) 
{ 
    int **array = new int*[size]; 
    for (int c = 0; c < size; c++) { 
     array[c] = new int; 
    } 
    cout << "after allocation of " << size << endl; 
    for (int c = 0; c < size; c++) { 
     delete array[c]; 
    } 
    delete [] array; 
} 

int main() { 
    cout << "at start" << endl; 
    pause1(); 
    int size = 1000000; 
    for (int i = 0; i < 3; i++) { 
     allocate(size); 
     cout << "after free" << endl; 
     pause1(); 
     size *= 2; 
    } 
    return 0; 
} 

내가 "추신 -e를 실행하여 각 일시 정지 (전혀 메모리를 유지하지 않아야 할 때)에서 처리가 보유한 메모리의 양을 확인 - o vsz, cmd ".

 
    2648kb - at start 
18356kb - after allocating and freeing 1,000,000 ints 
    2780kb - after allocating and freeing 2,000,000 ints 
65216kb - after allocating and freeing 4,000,000 ints 

내가 페도라 코어 6에서 실행하고있어 사용하여 GCC 4.1.1 :

각 일시에 처리가 보유 금액은 다음과 같다.

+0

왜 이것이 문제입니까? 기억에 남는 일이 없습니까? – jalf

+0

메모리 사용량이 많은 동안에는 스와핑으로 인해 시스템 속도가 느려집니다. 메모리가 실제로 응용 프로그램에 의해 해제 된 경우 피하고 싶습니다. –

답변

10

C 라이브러리가 사용하는 메모리 할당자는 청크의 크기에 따라 다양한 방식으로 항목을 할당합니다. 메모리가 해제되면 페이지가 항상 OS로 반환되는 것은 아닙니다. 특히 작은 할당을 많이 수행하는 경우에 특히 그렇습니다.

메모리는 작은 할당이 아닌 페이지 단위로 OS에 반환 될 수 있습니다. 당신은 당신이 원하는 무엇이든 할 수 있습니다 (- 당신이 정말로 알고 싶다면

, 그것은 등 용기는 자신의 메모리 관리를 할 수 있도록 당신이 할당자를 대체 할 수 있습니다 ++ C에서

C 라이브러리 소스 코드와 악기를 검토 예 : mmap/dev/zero 또는 무엇이든)

+3

자신 만의 메모리 관리를하지 않는 한, 거의 OS로 돌아 가지 않습니다. 표준 메모리 관리 (내가 본 구현에서)는 OS가 제공하는 모든 것을 유지합니다. –

4

일반적으로 Linux 박스를 사용하는 경우, 기본 malloc이 힙에 물건을 할당하기 시작하고 커질 것입니다.하지만 큰 안쪽 청크를 비우면 그 동안 아무것도 확보 할 수 없습니다 힙의 맨 위 부분은 해제되며 힙을 늘리거나 줄이는 것이 가능합니다.

따라서 거대한 청크를 할당 한 다음 나중에 작은 청크를 할당 한 다음 버그 청크를 해제하면 해당 프로세스가 순서대로 배치되고 작은 청크를 해제 할 때까지 프로세스가 해당 청크를 줄일 수 없습니다. 힙 크기.

현재 예제에서 다음 번 할당을 기다리지 않고 나중에 배정 된 항목이 있기 때문에 나중에 해제 할 수 없습니다. 아니면 주어진 메모리 크기까지 해제되지 않을 수도 있습니다.