Я понимаю, что выделение памяти, сделанное в одной dll, а затем free'd в другой, может вызвать все виды проблем, особенно в отношении CRT. Подобные проблемы особенно проблематичны при экспорте контейнеров STL. Мы сталкивались с подобными проблемами раньше (при написании пользовательских плагинов Adobe, связанных с нашими библиотеками), и мы решили эти проблемы, определив наш собственный распределитель, который мы используем во всех наших контейнерах, например:
typedef std::vector < SessionFields,
OurAllocator < SessionFields > >
VectorSessionFields;
typedef std::set < SessionFields,
std::less < SessionFields >,
OurAllocator < SessionFields > >
SetSessionFields;
Это хорошо сработало при передаче типов в / из нашего кода, однако мы столкнулись с проблемой в том, что теперь нам нужно вызвать функцию в SDK Adobe, которая возвращает заполненный вектор, который вызывает сбой при выходе из него области видимости.
Очевидно, это проблема с выделением памяти в SDK Adobe, принадлежащей другой куче, когда она, наконец, свободна в моем коде. Поэтому я думаю, что, возможно, я мог бы сделать что-то умное, например переопределить или экспортировать распределитель, используемый в их SDK, чтобы я мог использовать его для очистки контейнеров, возвращаемых из их функций.
Я также смотрю на написание оболочки или какого-то другого слоя, благодаря которому контейнеры STL будут безопасно размещаться между моим кодом и SDK (, хотя это звучит очень грязно ).
Кроме того, я также использую GetProcessHeaps
для определения кучи, используемой в SDK, и пытаюсь освободиться от этой кучи вместо кучи по умолчанию.
У кого-нибудь есть советы, как мы можем решить эту проблему?