2011-03-28 3 views
0

내 응용 프로그램에서 누수가 있고 나는 다음 코드를 줄이기 위해왔다 반복마다 약 12kb 유출. 이것이 내 코드에 문제가 있거나 xerces 라이브러리 자체에 문제가 있는지 나는 알 수 없다. 그러나 Perfmon의 Private Bytes를 보면 성장과 수축이 보이기 때문에 분명히 새어 나옵니다.메모리 누수 xerces 사용

사람은 이러한 놀라운 속도?

(단일 스레드 테스트 응용 프로그램)

for (int x = 0; x < 1000000; x++){ 
     DataSerializer* ds = new DataSerializer(); 
     ds->test(request); 
     ds->releasedocument(); 
     ds->destroy_xml_lib(); 
     delete ds; 
    } 

void DataSerializer::test(std::string& request) 
{ 
    impl = initialize_impl(); 
} 
DOMImplementation* DataSerializer::initialize_impl() 
{ 
    try 
    { 
     boost::mutex::scoped_lock init_lock(impl_mtx); 
     XMLPlatformUtils::Initialize(); 
     return DOMImplementationRegistry::getDOMImplementation(XConv("Core")); 
    } 
    catch(const XMLException& toCatch) 
    { 
     char *pMsg = XMLString::transcode(toCatch.getMessage()); 
     std::string msg(pMsg); 
     XMLString::release(&pMsg); 
    } 

    return NULL; 
} 
void DataSerializer::destroy_xml_lib() 
{ 
    boost::mutex::scoped_lock terminate_lock (impl_mtx); //is being used in MT app 
    XMLPlatformUtils::Terminate(); 
} 
void DataSerializer::releasedocument() 
{ 
    if (document){ 
     document->release(); 
     document = NULL; 
    } 
} 

이해가 안에서 누출의 원인이되는 다음 코드로 잘못 될 수 있는지 조언을 주시겠습니까 어떻게 이것이 누출 될 수 있니? 나는 무엇을 놓쳤는가?

+0

더 많은 소스 코드를 표시 할 수 있습니까? 예를 들어, DataSerializer 생성자는 어떻게 생겼을까요? –

답변

2

impl은 어디에서 삭제 되나요?

나는 API에 대해 더 많은 것을 알지 못한다. 그러나 그들은 내게 당신이 Terminate()을 호출해서는 안된다고 제안한다. 실제 프로그램에서 다른 곳의 다른 코드는 아마도 xerces 라이브러리를 사용하고있을 것이다. .

DOMImplementation은 포인터로 반환되며 수명주기를 관리해야하는 소멸자가 있습니다. 그것은 정말로 가능성이 이야기가 그게 당신의 메모리 누수 것 같습니다.

또한 DOMImplementationRegistry::getDOMImplementation()NULL을 반환 할 수 있으므로이를 방지해야합니다. 리눅스에서이 작업을 실행할 수있는 경우

,

+0

Will : afaik이 impl을 삭제해야합니다 : XMLPlatformUtils :: Terminate(); –

0

당신이 document을 할당 할 경우 확실하지 않음 (Purify는 Windows 용 상업과 동일) Valgrind를 사용합니다. ReleaseDocument() 함수에서는 삭제하지 않습니다. 당신이하는 일은 그것의 내용을 지운 후에 그것을 0으로 설정하는 것뿐입니다.

추 신 : xerces도 알지 못합니다.

+0

document-> release(); 삭제합니까 ... –