2011-01-17 13 views
1

私はxerces-cを勉強しようとせず、このチュートリアルをオンラインで続けていました。xerces-c:複数のファイルを解析するXml

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

私は何の問題もメモリチェッカー(valgrindの)を介してコンパイルおよび実行するためのチュートリアルを得ることができたが、私はわずかにプログラムに変更を行った場合、メモリチェッカーは、いくつかの潜在的漏れバイトを戻しました。私は、プログラムが1つではなく2つのファイルを読み込めるように、メインにいくつかの行を追加しました。

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

例のコードのように見えますが、使用例にはいくつかの欠点があります。我々はトランスコードを見ることができますthe documentationから

m_OptionA = XMLString::transcode(xmlch_OptionA); 

XMLString::release()で返さ(Cスタイル)の文字列を解放する呼び出し元が必要です。それは、このコードが含まれています。私たちは、これがGetConfigデストラクタで行われていることがわかります。

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

しかし、このコードはreadConfig()に存在しません。そこに追加する必要があります。これらのCスタイルの文字列メンバをコンストラクタ内でNULLに初期化したい場合や、readConfig()を1回または2回ではなく0回呼び出すと、別のメモリの問題(潜在的にクラッシュバグ)が発生する可能性があります。

+0

ああ、リリースをreadConfig()関数に入れようとしましたが、完全に機能しました。唯一の問題は、メンバー変数が解放される前にprintステートメントを呼び出す必要があることでした。ありがとう。 – user459811

+0

おそらくあなたは私の答えを受け入れるようにするほど親切になるでしょう。 –

関連する問題