Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] 25.02.03 18:43 Число просмотров: 993
Автор: chaka Статус: Незарегистрированный пользователь
|
> Бред. Даже не поленился сейчас тестик написать. Все > работает нормально (что и не удивительно). В противном > случае куча проектов бы давно отвалились, это раз, а два:
Вот это уже обидно. Зачем сразу бред? Ты действительно сделал, проверил, работает. Отлично, а теперь запусти тоже самое но под отладчиком (или просто debug-версию) и получишь объяснение моего бреда. - Assertion Failed! _CrtIsValidHeapPointer(pUserData). А в релизе, где у тебя все работает - ты освобождаешь кусок адресного пространства в куче исполняемого модуля и раз "у тебя все работает", то довольно успешно, но, вот когда кто-то в этом исполняемом модуле совершенно случайно вместо своих данных в куче найдет там "бред", то не обижайся, просто, при освобождении памяти, выделенной в dll ты с чистой совестью грохнул данные, предназначенные совершенно для других целей (им просто не повезло, они находились по тому же (или смежному) адресу, что и данные, выделенные в dll, только в ДРУГОЙ КУЧЕ).
P.S. А если у тебя никаких предупреждений не всплывет в debug-версии программы, то, возможно ты компилируешь exe и dll-модули, связанные с библиотекой времени выполнения по динамике, ну, а если crt у тебя скомпонована по статике, то советую подумать о смене компилятора или замене библиотеки времени выполнения (CRT).
> весь COM основан на передаче указателей между модулями (мы > говорим сейчас об одном процессе ! так что, умных слов типа > "маршалинг" - не надо !).
Весь COM построен на принципе подщета ссылок, а не передаче указателей.
В результате подсчета ссылок если Release() возвращает 0, то память, выделенная под объект, освобождается, но это происходит в коде того модуля, КОТОРЫЙ ВЫДЕЛИЛ память под класс. Это происходит потому, что фабрика по созданию объектов и сам объект (который сам себя уничтожает) находятся в ОДНОМ модуле (exe или dll)
|
|
|