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