Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
1-61076
Совчсем новичок
2002-09-09 10:06
2002.09.19
MDI приложения.


1-61125
slykirill
2002-09-06 15:01
2002.09.19
помогите начинающему ламеру :)


7-61323
Kr_Alex
2002-07-10 16:06
2002.09.19
Завершение Win


3-60973
Skel
2002-08-28 11:49
2002.09.19
Как продублировать запись в таблице Paradox??


6-61244
Shur_ap
2002-07-15 20:53
2002.09.19
Разрыв соединения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский