Замечательное свойство shared_ptr заключается в том, что он хранит в себе ссылку на deleter - функцию, которую shared_ptr вызывает для удаления объекта.
То есть если мы создадим shared_ptr в EXE и передадим его в DLL, которая потом будет удалять объект из динамической памяти, то она вызовет operator delete (или другой заданный deleter), который находится в EXE! Это спасет нас от головной боли с несколькими копиями CRT (одна в EXE, другая в DLL), которая была бы если бы мы передали простой указатель, а не shared_ptr.
Правда возникает вопрос: не возникнет ли у shared_ptr проблем с подсчетом ссылок при пересечении границы EXE-DLL?
Подписаться на:
Комментарии к сообщению (Atom)
4 комментария:
Проблема в том, что для создания счетчика используются голые функции new/delete. А так как это header-only библиотека, то и функции будут вызываться у того CRT, где исполняется код. Так что, от проблемы разных CRT при пересечении границы модуля это не спасет :\
shared_ptr запоминает адрес operator delete() из CRT того exe или dll, который создал этот shared_ptr, соответсвенно это будет именно та CRT, где был вызван operator new() при создании shared_ptr.
Это делетер для объёкта, которым владеет указатель, с ним проблем нет. Но есть еще счетчик, который динамически аллоцируется при инициализации shared_ptr голым указателем.
Так вот этот счетчик и использует обычные new/delete.
Тогда получается что Абрахамс врёт?
Отправить комментарий