2012-07-19 2 views
1

나는이 것, 그래서, 내 질문은 내가STL deque pop_front()가 자동으로 메모리를 재활용합니까?

while (data.size() > 0) 
    { 
     for (int i=0; i < 10; i++) 
     { 
      fprintf(fPtr, "%lf\t", data[0]->at(i)); 
     } 
    fprintf(fPtr,"\n"); 
    data.pop_front(); 
    } 

을 파일에 데이터를 저장하려면, 내가 어떤 데이터를 수집하는 프로그램을 가지고

typedef vector<float> floatVector; 
    ... 
    floatVector * currRecord; 
    deque<floatVector *> data; 
    ... 
    ... 

    for (...) 
    { 
     ... 
     currRecord = new floatVector(10); 
     data.push_back(currRecord); 
    } 

나중에 양단 큐에 임시로 저장 프로그램에서 메모리 누수가 발생합니까? 각 currRecord 벡터에 대해 메모리를 할당하기 위해 new 연산자를 사용합니다. deque pop_front 기능이 자동으로 메모리를 재활용합니까? 아니면 내가

data.pop_front(); 

전에

delete [] data[0] 

을 넣어해야합니까? 또한 data이 양키 (deque) 대신 벡터 인 경우 모든 것이 동일 할 것입니까? 감사!

답변

6

포인터가 std::deque이고 각 포인터가 리소스 (메모리)를 소유하고 있습니다. pop_front()을 호출하면 컨테이너에서 포인터가 제거되지만 포인터가 소유하는 메모리는 해제되지 않습니다. new으로 메모리를 할당하므로 delete으로도 전화해야합니다. 컨테이너가 std::vector 인 경우 상황은 변경되지 않습니다.

std::deque<floatvector> 또는 std::shared_ptr과 같은 스마트 포인터 컨테이너로 변경하면 메모리 누출을 피할 수 있습니다.

new을 호출 할 때 []을 사용하지 않았으므로 대괄호없이 일반 delete을 사용하십시오.

+0

감사! 그건 내 질문에 대한 답변. –

관련 문제