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