Re: Возврат умного указателя из dll
От: Кодт Россия  
Дата: 05.12.05 21:20
Оценка:
Здравствуйте, dleather, Вы писали:

D>Столкнулся с такой вот проблемой. Есть головной exe и dll. Есть собственный умный указатель, следующего вида:

D>template <typename T>
D>class CtSmartLink
D>{
D>  private:
D>    typedef CtValues<T*, int> CtdRefCount; // CtValues - обертка для std::map

D>    static CtdRefCount * m_pRefCount;      // статический указатель на map, где храним кол-во ссылок
  .....

Это природное явление — частный случай нарушения One Definition Rule.
Статический член был определён и в dll, и в exe. В результате — тот код, который имеет с ним дело внутри dll, обращается к своему экземпляру, а тот, который в exe — к своему.

D>P.S. Кривое решение впринципе есть. Это делать данный map в головном exe, а dll давать на него ссылку.

"Ну, или так".

А ещё можно было вынести "службу подсчёта ссылок" в отдельную dll, в виде функций
int addref(void* key);
int release(void* key);

и пусть твои шаблоны пользуются этими функциями на здоровье.

Вообще, зачем делать такой странный подсчёт ссылок? Чем не понравился, к примеру, boost::shared_ptr?
Или очень нужна была интрузивность?

Кстати говоря, нужно быть очень аккуратным, когда делаешь внешний счётчик ссылок. Кастинг туда-сюда, и получаешь другое значение указателя на тот же самый объект.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.