2011-01-21 2 views
2

나는 메모리 누수를 감지하는 Visual Leak Detector를 사용하고, 그리고 같은 라인에서 메모리 누수의 많은 경우가 발생했습니다 :std :: map operator []가 기본적인 데이터 형식으로 메모리 누수를 일으키는 방법은 무엇입니까?

class SomeClass 
{ 
    // ... 
    std::map<long,long> some_map; 

    void func(long a_long, long b_long) 
    { 
     some_map[a_long] = b_long; // here be a memory leak 
    } 
} 

어떻게 이런 일이 가능하다조차? 여기에 포인터가 없으며 객체 인스턴스화가 없습니다.

다른 이유로 인해 프로그램이 중단되는 부작용이 메모리 누출 일 수 있습니까? 프로그램이 충돌하거나 종료 (1)하면지도가 깨끗하게 파괴되지 않습니까?

답변

8

여기에 게시 한 코드는 완벽하게 괜찮 및 누출의 원인이 안된다, 그래서 몇 가지 가능한 범인이있다 :

  1. 일부 STL 구현은 해제하지 않고 메모리를 동적으로 할당 유지하는 사용자 정의 할당자를 사용 미래의 할당을 더 빠르게하기 위해서입니다. 그러한 구현이 가능하고이 최적화를 사용하고있어 메모리 검사기의 관점에서 누수처럼 보일 수 있습니다.
  2. 프로그램이 비정상적으로 종료되면 map 소멸자 (또는 그와 관련하여 객체 소멸자)가 호출되지 않아 메모리 누수가 발생할 수 있습니다.
+0

귀하와 피터의 답변을 결합해야합니다. – Omnifarious

+0

exit (1) 명령으로 비정상적인 종료가 발생합니까? – Jonathan

+1

@ Jonathan- 스펙 18.3.8 절에 따르면 "자동 객체는'exit() '를 호출 한 결과 파괴되지 않습니다." 그래서 예, 'exit'를 호출하면 소멸자가 실행되지 않습니다. – templatetypedef

4

거기에는 메모리 누수가 없지만 인스턴스화가 있습니다.

지도에 삽입 할 때 트리에 새 노드를 만들어야합니다 (지도는 일반적으로 red-black tree입니다). 일반적으로 맵은 삽입 할 때마다 동적 메모리를 할당하며, 기본 유형, 사용자 정의 유형 또는 포인터와 다를 바 없습니다.

관련 문제