20 апреля 2006

Передача динамически созданных объектов в DLL

Замечательное свойство shared_ptr заключается в том, что он хранит в себе ссылку на deleter - функцию, которую shared_ptr вызывает для удаления объекта.

То есть если мы создадим shared_ptr в EXE и передадим его в DLL, которая потом будет удалять объект из динамической памяти, то она вызовет operator delete (или другой заданный deleter), который находится в EXE! Это спасет нас от головной боли с несколькими копиями CRT (одна в EXE, другая в DLL), которая была бы если бы мы передали простой указатель, а не shared_ptr.

Правда возникает вопрос: не возникнет ли у shared_ptr проблем с подсчетом ссылок при пересечении границы EXE-DLL?

4 комментария:

Nunquam dormio комментирует...

Проблема в том, что для создания счетчика используются голые функции new/delete. А так как это header-only библиотека, то и функции будут вызываться у того CRT, где исполняется код. Так что, от проблемы разных CRT при пересечении границы модуля это не спасет :\

Raider комментирует...

shared_ptr запоминает адрес operator delete() из CRT того exe или dll, который создал этот shared_ptr, соответсвенно это будет именно та CRT, где был вызван operator new() при создании shared_ptr.

Nunquam dormio комментирует...

Это делетер для объёкта, которым владеет указатель, с ним проблем нет. Но есть еще счетчик, который динамически аллоцируется при инициализации shared_ptr голым указателем.
Так вот этот счетчик и использует обычные new/delete.

mstone комментирует...

Тогда получается что Абрахамс врёт?