Недавно я столкнулся с проблемами с выделением памяти, сделанным в одной DLL (или * .so - переносимый код), и освобождением, выполненным в другой DLL. До сих пор я обнаружил следующие ошибки:
По сути, я решил, что мне следует придерживаться правила: не выделять память в одной DLL и освобождать ее в другой (и желательно хранить ее в одном файле cpp). Обычно это также означает, что мне не следует выделять файлы в заголовочном файле, который может совместно использоваться более чем одной DLL. Это означает, что мне не следует выполнять выделение в tempaltes (поскольку все они находятся в заголовке), и это довольно большое ограничение.
Когда мне действительно нужно создать новый объект в шаблоне, что я делаю теперь он выделяет память для этого файла cpp и только затем запускает его c'tor с оператором размещения new.
// header
class MyBase
{
public:
static void* allocate(std::size_t i_size);
};
template <typename T>
class MyClass: MyBase
{
public:
T* createT();
};
temlpate <typename T>
T* MyClass<T>::createT()
{
void* pMem = MyBase::allocate( sizeof(T) );
return new (pMem) T;
}
// Cpp file
void* MyBase::allocate(std::size_t i_size)
{
return malloc( i_size );
}
Пока это работает, это немного некрасиво. Это означает написание кода шаблона без использования new.
Еще одно значение состоит в том, что если вы не знаете, что шаблон был написан с использованием этого метода, вы должны использовать его только константные методы в файле заголовка (включая другие шаблоны) (это предполагая, что методы const не выделяют и не освобождают память). Сюда входит STL. Фактически, одно из мест, с которыми я столкнулся, было в векторе, размер которого был изменен одной динамической библиотекой (в HP-UX), а затем выгружен, чем его d'tor был вызван другой динамической библиотекой.
Есть ли какое-нибудь широко известное решение для этого мне просто не хватает или это просто проблема, на которую не обращают внимания?