xerces-c: анализ XML-файлов - PullRequest
       7

xerces-c: анализ XML-файлов

1 голос
/ 17 января 2011

Я пытаюсь выучить xerces-c и следил за этим уроком онлайн.

http://www.yolinux.com/TUTORIALS/XML-Xerces-C.html

Я смог получить учебник для компиляции и запуска через проверку памяти (valgrind) без проблем, однако, когда я немного изменил программу, программа проверки памяти вернуласьнекоторые потенциальные байты утечки.Я добавил только несколько дополнительных строк в main, чтобы программа могла читать два файла вместо одного.

int main()
{
   string configFile="sample.xml"; // stat file. Get ambigious segfault otherwise.

   GetConfig appConfig;

   appConfig.readConfigFile(configFile);

   cout << "Application option A="  << appConfig.getOptionA()  << endl;
   cout << "Application option B="  << appConfig.getOptionB()  << endl;

   // Added code
   configFile = "sample1.xml";
   appConfig.readConfigFile(configFile);

   cout << "Application option A="  << appConfig.getOptionA()  << endl;
   cout << "Application option B="  << appConfig.getOptionB()  << endl;

   return 0;
}

Мне было интересно, почему, когда я добавил дополнительные строки кода для чтения в другом файле XML, это приведет к следующему выводу?

==776== Using Valgrind-3.6.0 and LibVEX; rerun with -h for copyright info
==776== Command: ./a.out
==776== 
Application option A=10
Application option B=24
Application option A=30
Application option B=40
==776== 
==776== HEAP SUMMARY:
==776==     in use at exit: 6 bytes in 2 blocks
==776==   total heap usage: 4,031 allocs, 4,029 frees, 1,092,045 bytes allocated
==776== 
==776== 3 bytes in 1 blocks are definitely lost in loss record 1 of 2
==776==    at 0x4C28B8C: operator new(unsigned long) (vg_replace_malloc.c:261)
==776==    by 0x5225E9B: xercesc_3_1::MemoryManagerImpl::allocate(unsigned long) (MemoryManagerImpl.cpp:40)
==776==    by 0x53006C8: xercesc_3_1::IconvGNULCPTranscoder::transcode(unsigned short const*, xercesc_3_1::MemoryManager*) (IconvGNUTransService.cpp:751)
==776==    by 0x4038E7: GetConfig::readConfigFile(std::string&) (in /home/bonniehan/workspace/test/a.out)
==776==    by 0x403B13: main (in /home/bonniehan/workspace/test/a.out)
==776== 
==776== 3 bytes in 1 blocks are definitely lost in loss record 2 of 2
==776==    at 0x4C28B8C: operator new(unsigned long) (vg_replace_malloc.c:261)
==776==    by 0x5225E9B: xercesc_3_1::MemoryManagerImpl::allocate(unsigned long) (MemoryManagerImpl.cpp:40)
==776==    by 0x53006C8: xercesc_3_1::IconvGNULCPTranscoder::transcode(unsigned short const*, xercesc_3_1::MemoryManager*) (IconvGNUTransService.cpp:751)
==776==    by 0x40393F: GetConfig::readConfigFile(std::string&) (in /home/bonniehan/workspace/test/a.out)
==776==    by 0x403B13: main (in /home/bonniehan/workspace/test/a.out)
==776== 
==776== LEAK SUMMARY:
==776==    definitely lost: 6 bytes in 2 blocks
==776==    indirectly lost: 0 bytes in 0 blocks
==776==      possibly lost: 0 bytes in 0 blocks
==776==    still reachable: 0 bytes in 0 blocks
==776==         suppressed: 0 bytes in 0 blocks
==776== 
==776== For counts of detected and suppressed errors, rerun with: -v
==776== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2 from 2)

1 Ответ

1 голос
/ 17 января 2011

Похоже, пример кода имеет некоторые недостатки для вашего варианта использования.Он содержит этот код:

m_OptionA = XMLString::transcode(xmlch_OptionA);

Из документации мы можем видеть, что для транскодирования требуется, чтобы его вызывающая сторона освобождала возвращаемую (в стиле C) строку с XMLString::release().Мы можем видеть, что это делается в деструкторе GetConfig:

if(m_OptionA)   XMLString::release( &m_OptionA );

Но этот код не существует в readConfig().Вы должны добавить это там.Вы также можете инициализировать эти строковые члены в стиле C в NULL в конструкторе, или вы столкнетесь с другой проблемой памяти (возможно, сбоем), если вы вызовете readConfig() ноль раз вместо одного или двух.

...