0

アプリケーションに問題があります。以前は問題なく動作していましたが、今日もう一度実行してもう少しテストすると、いくつかのInvalid Pointer Operation例外が発生しました。

これはコードの一部です: ここで宣言します:

TXMLDocument *xml;

そして、以下の数行でそれを構築します:

xml = new TXMLDocument(NULL);

そして、構造の下の数行で、xml をロードし、「root」という名前のルート ノードにアクセスしようとしています。

xml->LoadFromXML(AnsiString(final_xml.c_str()));

//at the line below i am getting the Invalid Pointer Operation exception.
_di_IXMLNodeList root = xml->ChildNodes->GetNode("root")->GetChildNodes();

関数の最後で、xml を削除しています。

delete xml;

ここで関数全体を見つけることができます: http://pastebin.com/MpRf8Gfn

奇妙なことに、以前は find が機能していましたが、今ではどこからともなくこのエラーが発生しています (約 1 か月間、ソース コードを何も変更していませんが、以前は正常に機能していました)。

なぜこのエラーがポップアップするのか誰かがわかっているなら、私は感謝します. 前もって感謝します。

4

1 に答える 1

1

ドキュメントを読むTXMLDocumentと、所有者を持つインスタンスを作成するNULLと、通常のオブジェクトではなく、参照カウントされたインターフェイス オブジェクトのように動作します。そのため、適切な参照カウントのセマンティクスに従う必要がありますが、これは行っていないため、クラッシュします。

この状況でこれを行う最善の方法は、LoadXMLData()andを使用することです。次に_di_IXMLDocument例を示します。

void __fastcall TForm1::dataUpload2ServerServe(TCustomIpClient *ClientSocket)
{
    _di_IXMLDocument xml;
    ...
    xml = LoadXMLData(final_xml.c_str());
    _di_IXMLNodeList root = xml->DocumentElement->ChildNodes;
    ...
    xml->SaveToFile(filename);
    ...
}

xmlおよび変数がrootスコープ外になると、参照カウントが自動的に減らされます。それらを手動で「解放」したい場合は、単純に NULL を割り当てることができます:

root = NULL;
xml = NULL;

または、Release()メソッドを呼び出します。

root.Release();
xml.Release();
于 2014-09-18T00:03:42.403 に答える