短いバージョン: メンバー ポインター変数を持つクラスのコピー コンストラクターを安全に作成できますか?その 1 つはヒープ上にあり、型xercesc::XercesDOMParser*
はxercesc::DOMDocument*
? もしそうなら、どのように?
長いバージョン:
Xercesc ドキュメント オブジェクトをラップするクラスを作成しました。XercesDOMParser
aおよび 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
デストラクタからを削除する必要があると確信しています。しかし、その後、メモリリークが発生します。
これにアプローチする方法が本当にわかりません。多分それは不可能です。これに使用できるアプローチはありますか?