Укороченная версия: Могу ли я безопасно создать конструктор копирования для класса, который имеет переменные указателя члена, одна из которых находится в куче, которые имеют тип xercesc::XercesDOMParser*
а также xercesc::DOMDocument*
? Если так, то как?
Длинная версия:
Я написал класс, чтобы обернуть объект документа Xercesc. Он имеет две переменные-члены, которые являются указателями на XercesDOMParser
и DOMDocument
, Вот часть объявления класса, которая показывает эти два члена:
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
от деструктора. Но тогда у меня утечка памяти.
Я действительно понятия не имею, как подойти к этому. Может быть, это невозможно. У кого-нибудь есть подход, который я могу использовать для этого?
Задача ещё не решена.
Других решений пока нет …