2013-07-03 4 views
0

메모리 사용량을 확인하기 위해 작업 관리자를 열면 .3MB 메모리가 사용됩니다. ptr_vector에 100,000 개의 객체를 추가하면 2.3MB의 메모리가 사용됩니다. 벡터에서 .clear()를 사용하면 메모리는 .8-.9MB로 이동합니다. 이 증가 된 메모리 사용의 원인은 무엇입니까?C++에서 boost :: ptr_vector로 메모리가 누수 됨

여기에 코드입니다 : 도움을

#include <iostream> 
#include <boost/ptr_container/ptr_vector.hpp> 

class T { 
public: 
    static int nObjects; 
    T() { 
     nObjects++; 
    } 
    ~T(){ 
     nObjects--; 
    } 
}; 

int T:: nObjects = 0; 

int main() { 
    boost::ptr_vector<T> vec; 
    char pause; 
    std::cout << "Press any key to continue: "; 
    std::cin >> pause; 

    for(int i=0; i<100000; i++) { 
     vec.push_back(new T); 
    } 

    std::cout << T::nObjects << " objects created." << std::endl; 

    std::cout << "Press any key to continue: "; 
    std::cin >> pause; 

    vec.clear(); 
    std::cout << T::nObjects << std::endl; 

    std::cout << "Press any key to exit: "; 
    std::cin >> pause; 
    return 0; 
} 

감사합니다.

답변

1

당신이 잊고있는 것 같다 메모리의 또 다른 큰 덩어리가있다.

이 문 :

vec.clear(); 

delete D는 new로 생성 된 모든 T의,하지만 그 자체가 모든 포인터를 개최 할당 vec하는 메모리를 해제하지 않았다. vec.capacity()으로 전화하면 vec에 최소한 100000 T*을 수용 할만한 충분한 공간이 있음을 알 수 있습니다.

boost::ptr_vector<T>().swap(vec); 

이 다음 swap() 호출 vec의 내부 스토리지를 취 임시 ptr_vector 작성, 그 메모리를 확보 스왑 관용구를 사용하려면

. 그런 다음 임시가 ;에서 삭제되면 모든 저장소가 해제됩니다.

+0

대단히 감사합니다! 이는 증가 된 메모리 사용량의 대부분을 차지합니다. 여분의 비트는 아마 요하네스의 메모리 페이지 유지에 대한 답변 때문일 것입니다. – Erik

2

Windows 작업 관리자를 메모리 사용에 사용할 수는 없습니다. 적어도 그렇게하지 마십시오.

메모리를 다시 할당해야하는 경우를 대비하여 아마도 메모리 페이지가 유지됩니다.

for 루프 (루프 내에서 vec + 자동 제거 구성)에서 메인에있는 것을 실행하십시오.
계속 증가하면 실제로 메모리 누수가 발생할 수 있습니다.

하지만 boost :: ptr_vector를 잘못 사용하지 않는 한 의심 스럽습니다.

2

모양에서 보았을 때 boost :: ptr_vector를 사용해야합니다.

Windows 성능 모니터를 사용하여 응용 프로그램 메모리 사용을 적절하게 식별하는 것이 좋습니다. 포인터를 개최 vec에 할당 된 공간 : 윈도우 7에서 성능 모니터를 사용하는 방법에 대한 지침은 this blog를 참조 것은