libxml2를 사용하는 클래스가 있습니다. 스키마 파일과 파서의 컨텍스트를 유지하는 데 사용되는 정적 멤버가 있습니다. 나는 valgrind를 사용하고 있으며 메모리가 스키마 컨텍스트와 관련하여 할당이 해제되지 않는다고 불평하고 있습니다. 이것은 당신이 그 기억을 직접 해방시켜야하기 때문입니다. 그러나 이러한 컨텍스트 변수는 정적이므로 개체를 파괴 할 때 자유롭게 할 수 없습니다. 필요한 자유 함수를 호출하는 방법이 있습니까, 아니면 valgrind를 무시해야합니까?프로세스 끝에서 정적 멤버에게 뭔가를 할 수있는 방법이 있습니까?
답변
XML 사용 클래스 내에서 다른 클래스를 선언하십시오. 의 소멸자에서 정적 멤버를 정리합니다. 이제 외부 클래스에 내부 클래스 유형의 다른 정적 멤버를 제공하십시오. 중요하지 않은 소멸자가 있으면 프로그램이 종료 될 때 정리되고 다른 값도 정리됩니다.
class UseLibXml {
static int xmlvar;
struct StaticCleanup {
~StaticCleanup() {
CleanUpLibXmlVar(UseLibXml::xmlvar);
}
};
static StaticCleanup static_cleanup;
};
는 .CPP 파일 중 하나에 당신이 다른 정적 변수를 정의
UseLibXml::static_cleanup
같은 장소를 정의합니다.
핸들을 설정하고 거기에서 무료로 atexit
을 설정하십시오. 또는 무시하십시오.
프로세스가 끝날 때 valgrind 오류가 표시되면 걱정할 필요가 없습니다. 컨텍스트 변수가 정적 인 이유는 무엇입니까?
valgrind가 정적 컨텍스트와 관련된 오류를 무시하게하는 억제 파일을 생성 할 수 있습니다. valgrind 설명서의이 페이지를 참조하십시오. suppressing errors
기본적으로, 클래스는 "독자"이고 프로그램에 대해 하나의 유효한 스키마가 :
이class X { private: static Plop* staicXData; // Initialised in the code. };
내가로 변경합니다. 따라서 주문형 스키마를 읽고 구문 분석 컨텍스트를 만들었지 만 작성된 다른 모든 독자는 해당 파일을 다시 히트 할 필요가 없습니다. – Dave
메모리 누수가 아니기 때문에이 경고를 무시해도 좋다고 생각합니다. 그 (것)들에 의해 점령 된 기억은 당신의 응용 프로그램이 나가자 마자 OS로 되돌아 갈 것입니다.
즉, 응용 프로그램이 종료됩니다. 라이브러리를 언로드하고 다시로드하면 어떻게됩니까? –
이 정적 변수는 포인터라고 가정합니까? 당신을 가정
가 있습니다
Class X
{
private:
static Plop& getStatoc()
{
static Plop data; // Auto created on first use.
// Destroyed on program exit.
return data;
}
};
'StaticCleanup'이 거기에'class' 대신'struct'로 정의되어 있어도 상관 없습니까? – Dave
구조체로 만들면 명시 적으로 소멸자를 공개하지 않아도됩니다. Public 대 private는 구조체와 클래스 간의 유일한 차이점입니다. –
이것을 구현하고 작동합니다. 감사! – Dave