Я получаю ошибки выделения памяти (и последующий сбой) для следующего упрощенного кода:
std::wstring myKey = L"str_not_actually_constant";
MyType obj;
Read( obj );
std::map<std::wstring, MyType> myMap;
myMap[myKey] = obj; // Sometimes allocation error (1)
...
Read( MyType& obj )
{
obj.member1 = ReadFromFuncThatMayBeProblem();
obj.member2 = ReadFromFuncThatMayBeProblem(); // Sometimes allocation error (2)
/* more members */
}
...
void operator =( const MyType& source )
{
if( this != &source )
{
member1 = source.member1; // std::wstring
member2 = source.member2; // Usually (1) happen on the second member. // std::wstring
/* more members */
}
}
Либо (1), либо (2).
Теперь, если я просто продолжу, независимо от ошибки (с помощью отладчика), значение действительно будет введено в карту.
Я не знаю, является ли преступник ReadFromFuncThatMayBeProblem (), но это довольно сложная функция, которую я не могу разглашать здесь.
Кроме того, это код, который работал (или, по крайней мере, казался работающим) до того, как другие разделы приложения были портированы для использования OpenSSL. Я не знаю, могло ли это иметь какое-то влияние здесь.
Итак, что я могу сделать, чтобы отследить эту ошибку выделения, поскольку я предполагаю, что приведенный выше код на самом деле не является проблемой?
Редактировать: Подробнее:
Для MyType нет dtor.
Однако MyType имеет элемент типа SecondType с элементом void *. Это удаляется и null'd в деструкторе этого типа. Конструктор использует m_pData = new std :: wstring ( ((std :: wstring ) source.m_pData)); для струнных. (И аналогично для других типов данных). Может ли это быть проблемой? (удалить static_cast (m_pData);)
Другими типами элементов MyType являются std :: wstring, unsigned long, bool, enum, structs (среди них timeb) и SecondType.