Сбой с новым / удалить, но не с malloc / free в коде C ++ - PullRequest
2 голосов
/ 18 июня 2010

Моя среда разработки - [Windows 7; визуальная студия 2010; x86].

У меня есть DLL, которая была построена для сервера 2003 давным-давно. Когда я использую его в своем проекте и следую последовательности new / delete для использования класса, приложение вылетает во время вызова удаления. Я подтвердил то же самое, даже без какого-либо другого вызова между новым и удалить. Когда я заменяю new / delete на malloc / free, сбоев не происходит. Если я просто объявляю экземпляр класса без нового, при выходе из области не происходит никакого сбоя.

Есть идеи, что может пойти не так? Это внутренняя библиотека нашей компании, поэтому я не смогу назвать ее и другие подобные вещи.

Дополнительная информация: Чтобы использовать эту библиотеку в первую очередь, мне пришлось отключить функцию VS "Обрабатывать wchar_t как встроенный тип".

Код прост

{
   CLogger * myLog = new CLogger(); 
   delete myLog; // Crash happens here 
} 

{ // No crash here 
  CLogger MyLog; 
} 

{ 
  CLogger * myLog = (CLogger *) malloc (sizeof(CLogger)); 
  free (myLog); // This does not crash. 
} 

Поскольку это проприетарная библиотека, я не могу опубликовать конструктор и деструктор.

Ответы [ 2 ]

7 голосов
/ 18 июня 2010

удаление делает больше, чем просто освобождение памяти: оно также вызывает деструктор раньше.Это означает, что в деструкторе этого класса должно быть что-то плохое.

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

Я бы рекомендовал вам поставить

try {} catch (std::exception& e){} catch(...) {}

внутри деструктора и выйдите из системы, или выйдите из отладчика с возможностью остановиться в том месте, где выдается исключение.

Тогда он долженЛегко определить, что отличается.Мне кажется, это могут быть некоторые права доступа к реестру или доступа к файлам, когда некоторые изменения были внесены с сервера 2003 в Windows 7.

3 голосов
/ 18 июня 2010

Я применяю свои навыки психической отладки, чтобы предположить, что вы используете delete там, где вы должны использовать delete[].

Рассуждение: если вы смогли тривиально заменить new на malloc,вы, вероятно, выделяете массив примитивных типов, а не объект, и наивно используете delete вместо free в предположении, что распределение объектов и массивов одинаково в C ++.(Это не так.)

...