Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.19;
Скачать: CL | DM;

Вниз

Проблемы с XML   Найти похожие ветки 

 
A. N. Onim   (2002-09-10 11:25) [0]

Помнится, под MSVC работал с MSXML парсером и неоднократно сталкивался с Гамлетовским вопросом - освобождать или не освобождать полученный интерфейсный указатель дитя (Child) при просмотре XML узла? Ответ был, как ни странно, нет. Release был не нужен.
Перешёл на Delphi, к компоненте TXMLDocument.
Беру корневой узел:

...
public:
m_pDocument: TXMLDocument;
...
procedure Test()
var
Saved: IXMLNode;
begin
m_pDocument := TXMLDocument.Create(nil);
m_pDocument.DOMVendor := GetDOMVendor ("MSXML");
m_pDocument.LoadFromFile("pos.xml");
Saved := m_pDocument.Node.ChildNodes[0];

// так просто тестик, что работает!
Form1.Caption := Saved.NodeName;

При выходе! БА - БАХ ! Access Violation
end;

Как я понимаю, был вызван Release на локальной копии интерфейса Saved при разрушении. Ладно. Добавлю в код _Addref() для Saved - не помогает. Двойной _Addref() выправляет ситуацию, но... Всё падает при уничтожении документа :( По ходу парсеринга такое г..о лезет аж жуть. Типа, у узла есть дети (HasChilds = true), а сами дети NodeChilds - Access Violation? Скажите, что это за гемор такой???


 
A. N. Onim   (2002-09-10 12:36) [1]

Создавать документ надо было обязательно с нениловским Parent"ом Вопрос исчерпан. Чёртов Delphi!


 
Ihor Osov'yak ©   (2002-09-10 13:02) [2]

Еще когда-то очень давно говорось, и не единыжды, не работайте одновременно по обьектным и интерфейсным ссылкам. Геморою не оберетесь. Это так, философия.

А теперь по существу. Интерфейсы в делфи относятся к "автоуничтожаемым" обьектам (тут термин обьект мной употреблен для для обозначения инстанции какого то класса, а для обозначения некой програмной субстанции).
Механизм "автоуничтожения" по отношению к интерфейсам работает так:
компилятор неявно вызывает _release всякий раз, когда интерфейсная ссылка уходит из области видимости или когда ей присваеватся новое значение (_release вызывается для старой ссылки). _Addref вызывается неявно при операции присваивания ...

Мораль здесь такова - не надо в делфи _release и _Addref явно вызывать. А если возникнет такое желание - хорошенько подумать, почитать книжки, попить водички и пт и снова подумать. И так до тех пор, пока это желание не пропадет.

Далее. Естественно, рано или позно будет вызван _release, который приведет к уничножению обьекта. А если мы еще имеем обьектную ссылку - как в вашем случае - то обьект уничтожается, ссылка на него смотрит, мы по ней чего то делаем - со всеми последствиями. Надеюсь, теперь понятно, почему я говорил, что очень неприветствуется одновременная работа по обьктным и по интервейсным ссылкам. Если все же очень нужно - то нужно предусмотреть "удерживающую" интерфейсную ссылку. Которую потом не забыть обнулить...




Страницы: 1 вся ветка

Текущий архив: 2002.09.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
4-61349
Rookie
2002-07-26 13:37
2002.09.19
User32 под микроскопом


1-61173
Brand
2002-09-05 23:02
2002.09.19
Совместный доступ к файлу.


14-61307
Ч а й н и к
2002-08-19 13:36
2002.09.19
Распространение программ в сети


4-61360
hovl
2002-07-30 20:31
2002.09.19
Штфрование


14-61315
lak_b
2002-08-24 23:49
2002.09.19
память