1

短いバージョン: メンバー ポインター変数を持つクラスのコピー コンストラクターを安全に作成できますか?その 1 つはヒープ上にあり、型xercesc::XercesDOMParser*xercesc::DOMDocument*? もしそうなら、どのように?

長いバージョン:

Xercesc ドキュメント オブジェクトをラップするクラスを作成しました。XercesDOMParseraおよび aへのポインターである 2 つのメンバー変数がありますDOMDocument。これら 2 つのメンバーを示すクラス宣言の一部を次に示します。

class XMLigator {
private:
    xercesc::XercesDOMParser* _pParser;
    xercesc::DOMDocument* _pDocument;
    etc...

ポインター_pParser_pDocumentは、コンストラクターで初期化されます。以下は、関連するコードを含むコンストラクターの省略版です。演算子で_pParser作成され、ヒープ上にあることに注意してください。new

XMLigator::XMLigator(string strFile) : _strFile(strFile), _pDocument(NULL) {
    xercesc::XMLPlatformUtils::Initialize();
    _pParser = new xercesc::XercesDOMParser();  
    _pParser->parse(_strFile.c_str());
    _pDocument = _pParser->getDocument();
}

デストラクタはメンバー変数を削除します_pParser:

XMLigator::~XMLigator(void) {
    if (m_pParser) {
        delete _pParser;
    }
}

これまで、コピー コンストラクターと代入演算子を非公開として定義せずに禁止してきました。

可能であれば、このクラスのコピー コンストラクターを作成して、この方法で関数の戻り値の型にできるようにしたいと思います。

XMLigator getOne() {
    XMLigator xml("/some/file.xml");
    return xml;
}

私が目にする最初の問題は、デストラクタがdelete _pParser;. だから問題だと思います。deleteデストラクタからを削除する必要があると確信しています。しかし、その後、メモリリークが発生します。

これにアプローチする方法が本当にわかりません。多分それは不可能です。これに使用できるアプローチはありますか?

4

0 に答える 0