Нахождение ошибки выделения памяти - PullRequest
2 голосов
/ 18 января 2010

Я получаю ошибки выделения памяти (и последующий сбой) для следующего упрощенного кода:

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.

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Наконец-то отследили ошибку.

Мы используем вышеупомянутую функциональность как часть большей сокетной связи с использованием OpenSSL (отсюда и выше ссылка). Сокет записывал данные и считывал данные в соответствии с упрощением кода выше.

Способ чтения сокета состоял в том, что мы перераспределяли память из одного буфера в другой (изменяя размер динамически). При этом мы используем ввод буфера и размер, который мы должны увеличить. При расчете размера использовался модуль для расчета коэффициента изменения размера. Это приводило к тому, что буфер был слишком большим или слишком маленьким для следующих операций.

Два дня отладки, чтобы заменить '%' на '/'.

Спасибо за поддержку, хотя.

0 голосов
/ 19 января 2010

какой тип возвращает ReadFromFuncThatMayBeProblem ()? Возвращает ли (постоянная) ссылка? если это так, остается ли объект действительным после выхода из области действия ReadFromFuncThatMayBeProblem ()?

...