Здравствуйте, 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?
Или очень нужна была интрузивность?
Кстати говоря, нужно быть очень аккуратным, когда делаешь внешний счётчик ссылок. Кастинг туда-сюда, и получаешь другое значение указателя на тот же самый объект.