удаление объекта 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
}

person pors    schedule 20.05.2013    source источник
comment
А XMLDoc не удаляется в GetMagicBox?   -  person Some programmer dude    schedule 20.05.2013
comment
нет - и если я не удалю этот объект, у меня будет утечка памяти. Он не большой, но всегда есть :/   -  person pors    schedule 20.05.2013


Ответы (2)


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

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

person Nicholas    schedule 21.01.2015
comment
Пожалуйста, воздержитесь от ответов только по ссылке, так как они бесполезны, если ссылка не работает. - person shauryachats; 21.01.2015

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

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

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

person Some programmer dude    schedule 20.05.2013
comment
Извините, но вы меня неправильно поняли. Я понимаю, что не могу удалить этот объект - XMLDoc. У меня не получается удалить строку XMLDoc, так как программа вылетает без какой-либо информации, отладка тоже не помогает. Я пробовал использовать delete XMLDoc и XMLDoc-›free() отдельно. - person pors; 20.05.2013
comment
@user2401015 user2401015 Тогда указатель где-то перезаписывается. Установите точку останова при размещении объекта и запишите полученный адрес указателя. Если это отличается, когда вы пытаетесь удалить указатель, вы перезаписываете его где-то. - person Some programmer dude; 20.05.2013
comment
@user2401015 user2401015 Если отладчик достаточно хорош, вы сможете добавить часы на XMLDoc, и тогда отладчик сломается, если он изменится. Тогда вы узнаете, где ваша проблема. - person Some programmer dude; 20.05.2013
comment
Спасибо за ваши предложения, но это не ключ. Я впервые столкнулся с такой ситуацией, что не могу удалить объект. Я добавляю код вверх ^^. - person pors; 20.05.2013