2009-12-16 1 views
2

libxml2를 사용하는 클래스가 있습니다. 스키마 파일과 파서의 컨텍스트를 유지하는 데 사용되는 정적 멤버가 있습니다. 나는 valgrind를 사용하고 있으며 메모리가 스키마 컨텍스트와 관련하여 할당이 해제되지 않는다고 불평하고 있습니다. 이것은 당신이 그 기억을 직접 해방시켜야하기 때문입니다. 그러나 이러한 컨텍스트 변수는 정적이므로 개체를 파괴 할 때 자유롭게 할 수 없습니다. 필요한 자유 함수를 호출하는 방법이 있습니까, 아니면 valgrind를 무시해야합니까?프로세스 끝에서 정적 멤버에게 뭔가를 할 수있는 방법이 있습니까?

답변

4

XML 사용 클래스 내에서 다른 클래스를 선언하십시오. 소멸자에서 정적 멤버를 정리합니다. 이제 외부 클래스에 내부 클래스 유형의 다른 정적 멤버를 제공하십시오. 중요하지 않은 소멸자가 있으면 프로그램이 종료 될 때 정리되고 다른 값도 정리됩니다.

class UseLibXml { 
    static int xmlvar; 

    struct StaticCleanup { 
    ~StaticCleanup() { 
     CleanUpLibXmlVar(UseLibXml::xmlvar); 
    } 
    }; 

    static StaticCleanup static_cleanup; 
}; 

는 .CPP 파일 중 하나에 당신이 다른 정적 변수를 정의 UseLibXml::static_cleanup 같은 장소를 정의합니다.

+0

'StaticCleanup'이 거기에'class' 대신'struct'로 정의되어 있어도 상관 없습니까? – Dave

+0

구조체로 만들면 명시 적으로 소멸자를 공개하지 않아도됩니다. Public 대 private는 구조체와 클래스 간의 유일한 차이점입니다. –

+0

이것을 구현하고 작동합니다. 감사! – Dave

2

핸들을 설정하고 거기에서 무료로 atexit을 설정하십시오. 또는 무시하십시오.

0

프로세스가 끝날 때 valgrind 오류가 표시되면 걱정할 필요가 없습니다. 컨텍스트 변수가 정적 인 이유는 무엇입니까?

valgrind가 정적 컨텍스트와 관련된 오류를 무시하게하는 억제 파일을 생성 할 수 있습니다. valgrind 설명서의이 페이지를 참조하십시오. suppressing errors

+0

기본적으로, 클래스는 "독자"이고 프로그램에 대해 하나의 유효한 스키마가 :

class X { private: static Plop* staicXData; // Initialised in the code. }; 

내가로 변경합니다. 따라서 주문형 스키마를 읽고 구문 분석 컨텍스트를 만들었지 만 작성된 다른 모든 독자는 해당 파일을 다시 히트 할 필요가 없습니다. – Dave

0

메모리 누수가 아니기 때문에이 경고를 무시해도 좋다고 생각합니다. 그 (것)들에 의해 점령 된 기억은 당신의 응용 프로그램이 나가자 마자 OS로 되돌아 갈 것입니다.

+0

즉, 응용 프로그램이 종료됩니다. 라이브러리를 언로드하고 다시로드하면 어떻게됩니까? –

0

이 정적 변수는 포인터라고 가정합니까? 당신을 가정

가 있습니다

Class X 
{ 
    private: 
     static Plop& getStatoc() 
     { 
      static Plop data;  // Auto created on first use. 
            // Destroyed on program exit. 
      return data; 
     } 
};