2013-06-28 4 views
0

현재 작업하고있는 프로그램에서 std::vectors을 포함하는 개체가 있습니다. 이러한 개체를 삭제하려고하면 개체가 메모리에서 해제되지 않고 문제가 발생합니다.std :: vector를 포함하는 개체의 메모리를 해제하는 방법

이 프로그램을 테스트하기 위해 최소한의 프로그램을 만들었으므로이 프로그램에서도 제대로 작동하지 않습니다.

다음은 내가 테스트했던 프로그램입니다.

#include<iostream> 
#include<vector> 

struct node{ 

    std::vector<int> list; 

    bool isParent; 
    struct node* child; 

    ~node(){ 
     delete[] child; 
    } 

    node(){ 
     isParent = false; 
     list.push_back(5); // comenting this line would make it work correctly 
    } 

    void divide_r(){ 
     if (isParent){ 
      for(int i = 0; i < 8; i++){ 
       (child+i)->divide_r(); 
      } 
     }else{ 
      node *c; 
      c = new node[8]; 
      child = &c[0]; 
      isParent = true; 
     } 
    } 
}; 

int main(){ 


    node *root = new node; 

    for(int i = 0; i < 8; i++){ 
     root->divide_r(); 
    } 

    delete root; 

    sleep(10); 

    return 0; 
} 

벡터에 아무 것도 넣지 않으면 메모리를 확보 할 수 없습니다.

우분투에서 g ++을 사용하고 있습니다. 틀린 일을하고 있습니까, 아니면이 일을해야합니까?

나는 또한 소멸자의 "목록"에서 메모리를 비우는 데 여러 가지 방법을 사용하려고했지만 "목록"이 범위를 벗어나면 어쨌든 해제해야한다고 생각합니다.

프로그램은 약 1.4GB의 RAM을 사용하지만 잠자기 후 프로그램이 종료되기 전에는 아무 것도 해제되지 않습니다.

+3

왜 *은'child' 멤버 * 아닌'list' 구성원에 대한 벡터를 사용하고 있습니까? –

+5

그건 보통의 것입니다. 해제 된 메모리는 OS에 즉시 반환되지 않지만 할당자가 유지합니다. 따라서 메모리 사용이 즉각적으로 줄어들지는 않습니다. –

+1

설정은 테스트 일 뿐이므로 여기서는 문제가되지 않습니다. 내가 Matteo보다 정확하게 이해한다면, 필요할 때 메모리를 해제해야합니까? 그래서 내가 삭제 한 후 메모리를 다시 채우려고한다면 필요에 따라 반환하겠습니까? – lasvig

답변

2

개체를 할당 한 다음 삭제하십시오. 새 개체를 할당하면 해당 OS에 증가 된 메모리 사용량이 표시되지 않습니다.

또한 valgrind를 통해 샘플을 실행할 수도 있으며 메모리 누수에 대해 불만을 제기하지 않아야합니다.

이유는 분명합니다. C 라이브러리는 각각의 작은 메모리 덩어리를 할당하고 반환하기 위해 OS를 호출하는 추가 오버 헤드를 피하고자합니다.

관련 스레드 : Linux Allocator Does Not Release Small Chunks of Memory, Does calling free or delete ever release memory back to the "system"

관련 문제