Пожалуйто, посоветуйте решение...
От: Jack Украина http://tr.dn.ua/~dionis/
Дата: 15.01.03 22:44
Оценка:
Поразмыслив, я решил сделать у себя подсчет ссылок в точности как в COM. Теоретически, все получалось красиво. В скриптовом языке, например, можно отказаться от оператора delete, как в c#. Для этого достаточно сделать в cVariant в соответствующих местах AddRef и Release. Но возникает одна пробелам. Если, вдруг, пользователю придет в голову написать в методе(в скриптовом языке) следующее:
this.test=this;
Тогда в объекте будет динамически создана переменная, указатель на самого себя, которая, в свою очередь будет иметь ссылку на объект. Такой объект, фактически, нельзя будет удалить. Раньше, для сборки мусора я использовал(и, в приницпе, не собирался отказываться) коллекцию(в приложении) указателей на все объекты в системе(наследники iBase аналог IUnkown)(в диструкторе они оттуда удалялись), и в момент удаления приложения, в случае, если в этой коллекции были объекты, они удалялись. Теперь этот метод работать не будет, так как даже если я, с горя, буду делать Release пока количество ссылок не станет равно 0(имеется ввиду в деструкторе приложения), то когда объект будет удаляться, удалиться и cVariant который хранит указатель на объект и снова попытается удалить этот объект.
В принципе, так как это будет происходить в диструкторе то можно просто сделать проверку на количество ссылок меньшее 0, то ничего не делать.
Это не красиво, но мелочь. Если поступать таким образом, то может возникнуть другая проблема. Ведь одновременно с этим, где нибудь еще может оказаться указатель на этот объект и уже после его удаления оного, снова попытается делать Release для существующего объекта. Частично эту проблему можно решить, при помощи функции IsValid(iBase*) которая проверяется в коллекции приложения существует ли переданный указатель. Но в таком случае придется делать такую проверку при каждом Release, что может сильно понизить производительность. В общем, пока красивых решений в голову не приходит. Может что ни будь посоветуете?
Искренне Ваш, Джек.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.