У меня довольно большая база кода, которая очень модульная (много-много плагинов), и очень часто требуется передавать строки и тому подобное между модулями. Для справки: код:
У меня сложилось впечатление, что передача объектов STL между модулями может действительно сломаться, если версия библиотеки или компилятора изменится. В частности, когда дело доходит до dtors и уничтожения объектов вне модуля / версии, в которой они были созданы.
Является ли MFC более безопасным в этом смысле? Можно ли безопасно передать объект MFC (например, CString
) из Base.dll в Plugin.dll? Вам нужно передать указатель, разве вы не можете безопасно удалить его из подключаемого модуля?
Имеет ли значение, если MFC статически связан или используется из библиотеки DLL?
MSDN упоминает в нескольких местах, что:
Все распределение памяти внутри обычной DLL должно оставаться в пределах DLL; DLL не должна передавать или получать от вызывающего исполняемого файла любое из следующего:
- указатели на объекты MFC
- указатели на память, выделенную MFC
Если вам нужно сделать что-либо из вышеперечисленного, или если вам нужно для передачи объектов, производных от MFC, между вызывающим исполняемым файлом и DLL необходимо создать DLL расширения.
Однако библиотеки DLL расширения страницы упоминают, что они предназначены в первую очередь для реализованных объектов, производных от объектов MFC. Мне это неинтересно, я просто использую их и переключаюсь между различными модулями.
Изменяет ли передача shared_ptrs что-нибудь (или класс с виртуальным dtor)?
Есть ли решение, не прибегая к типам C?