Шаблоны C ++ и распределение заголовков

Недавно я столкнулся с проблемами с выделением памяти, сделанным в одной DLL (или * .so - переносимый код), и освобождением, выполненным в другой DLL. До сих пор я обнаружил следующие ошибки:

  • Это просто не работает - не выполняется assert () при отладке.
  • Не работает. t работает, если одна DLL была статически связана со стандартной библиотекой C, а другая DLL динамически связана с ней.
  • Это не работает, если одна DLL выполняет выделение, тогда DLL выгружается, а другая 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 был вызван другой динамической библиотекой.

Есть ли какое-нибудь широко известное решение для этого мне просто не хватает или это просто проблема, на которую не обращают внимания?

5
задан Lightness Races with Monica 11 May 2011 в 09:14
поделиться