использование shared_ptr <T>между библиотеками с разными CRT - PullRequest
3 голосов
/ 20 июля 2011

Я пишу библиотеку, которая включает интерфейс для возврата \ получения shared_ptr объектов.

Все казалось просто модным, пока мне не напомнили, что приложение, использующее мою библиотеку, может иметь другую версию CRT, а такжеВерсия STL.

В связи с этим возникает два вопроса:

  1. Если версии STL отличаются между моим .lib и приложением, использующим его, как я могу убедиться, что одна и та же версия shared_ptr используется в моей библиотеке и приложении?(STL не обеспечивает двоичную совместимость)

  2. допустим, я решил вопрос 1, скопировав заголовок STL, определяющий shared_ptr и переименовав его в my_shared_ptr или любым другим способом, который теперь дает мнета же самая реализация shared_ptr в моей библиотеке и приложении.так как это шаблонный класс и версии CRT отличаются, как я могу убедиться, что new имеет соответствующий delete?Если моя библиотека компилирует my_shared_ptr<SomeClass>, а приложение компилирует my_shared_ptr<SomeClass>, каждая компиляция вставляет свои new и delete в соответствии с версией CRT.Теперь, когда я создаю и передаю shared_ptr из приложения в мою библиотеку для уничтожения, когда с ним завершается, могут вызываться несовпадения new и delete.

Прав ли япредположить, что должны быть скомпилированы два экземпляра my_shared_ptr<SomeClass>, один - .lib, а другой - приложением?

Спасибо за любую помощь, Лев

1 Ответ

1 голос
/ 20 июля 2011

AFAIK, вы не можете легко сделать это, хотя вы могли бы создать двоичный совместимый класс интеллектуальных указателей, например, на платформах Microsoft с использованием COM-объектов.Вы все еще должны убедиться, что распределение и освобождение происходят в одной и той же DLL.Это будет означать, что замена «new» и «delete» вашего класса интеллектуальных указателей вызовет функции, экспортированные из вашей DLL, которые гарантированно будут вызывать правильные новые и удалять реализации.

...