Удаление объекта TXMLDocument Embarcadero

У меня есть объект для удаления:

XMLDoc = new TXMLDocument(NULL);  

но я понятия не имею, как это сделать... это не работает

delete XMLDoc;
XMLDoc->free();

Когда я пытаюсь просто удалить объект, программа вылетает.

Так что это часть моего кода. У меня есть класс:

class C_XMLhandler{
    private:
        TXMLDocument *XMLDoc;
...
...
    public:
        void loadXMLfile(String name);
...
...
};

and example declaration of method:
bool C_XMLhandler::loadXMLfile(String name)
{
        XMLDoc = new TXMLDocument(NULL);
        Box=GetMagicBox(XMLDoc); //it's XML parser method, and it's doesen't matter
        delete XMLDoc; //when i reach this line the program scrashes
}

3 ответа

Решение

http://docwiki.embarcadero.com/Libraries/XE6/en/Xml.XMLDoc.TXMLDocument.Destroy

Объект удаляется компонентом, к которому он подключен (это), иначе не совсем уверен, я где-то читал, что он автоматически удаляется. (Хммм)

Это потому что ты delete объект перед вызовом free метод в теперь удаленном объекте.

Когда вы делаете delete XMLDoc память, выделенная для XMLDoc помечается как свободный, и деструктор объекта выполняется. Теперь при использовании указателя в вызове XMLDoc->free() вы обращаетесь к памяти, которая больше не выделяется, и вы испытываете неопределенное поведение, которое иногда приводит к сбою.

Вы должны сначала проверить, если free Метод не вызывается внутри деструктора объекта, и если это не так, делайте это наоборот. Если free вызывается в деструкторе, вам вообще не нужно его вызывать.

Получил ваше решение. Сам сегодня столкнулся с этим. Я полностью понимаю. У вас есть библиотека, создающая объект TXMLDocument на лету и отбрасывающая, когда вы закончите, но вместо этого приложение «отбрасывает файлы cookie», исключения для недопустимой операции указателя. Решение, назначьте ему владельца, который обрабатывает выпуск, и освободите владельца (TComponent).

Код Delphi, все та же концепция.

      procedure PlayWithDocument();
var
 owner: TComponent;
 doc: TXMLDocument;
begin
  owner := TComponent.Create(nil);
  try
    doc := TXMLDocument.Create(owner);
    // play with doc to your hearts content.
  finally
    // freeing owner, TXMLDocument.  
    // TODO: Check for memory leaks (I suspect none).
    FreeAndNil(owner);
  end;
end;
Другие вопросы по тегам