У меня снова возникли проблемы с выделением памяти, и я не могу понять, почему.
Когда я запускаю программу в режиме отладки, я получаю следующее сообщение об ошибке (я пытался перевести его максимально точно):
Windows запустила точку останова в LogoColorDetector.exe. Это может быть вызвано повреждением кучи, которое указывает на проблему в LogoColorDetector.exe или в одной из загруженных библиотек DLL [...]
Когда я отлаживал программу, обнаружил, что проблема возникает в следующей строке:
std::string tmp = imgTrain2[j]->getFilepath();
Функция getFilepath () - реализована следующим образом:
const std::string& support::Image::getFilepath() const
{
return this->_filePath;
}
Я уже проверил, имеет ли объект Image в imgTrain [j] правильную строку _filePath. Поэтому я предполагаю, что проблема в другом. Самое смешное, что функция, которая содержит проблемную строку, кажется, работает. Это только второй раз, когда я вызываю функцию, когда она выходит из строя, что указывает на то, что проблема не в самой функции. Я не выделяю память и не удаляю ничего в функции, кроме того, что может быть сделано косвенно через std :: string
В случае, если это поможет кому-то, вот трассировка стека:
msvcr100d.dll!_heap_alloc_base(unsigned int size) Zeile 55 C
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Zeile 431 + 0x9 Bytes C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Zeile 239 + 0x19 Bytes C++
msvcr100d.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Zeile 302 + 0x1d Bytes C++
msvcr100d.dll!malloc(unsigned int nSize) Zeile 56 + 0x15 Bytes C++
msvcr100d.dll!operator new(unsigned int size) Zeile 59 + 0x9 Bytes C++
LogoColorDetector.exe!std::_Allocate<char>(unsigned int _Count, char * __formal) Zeile 36 + 0xf Bytes C++
LogoColorDetector.exe!std::allocator<char>::allocate(unsigned int _Count) Zeile 187 + 0xb Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy(unsigned int _Newsize, unsigned int _Oldlen) Zeile 1933 + 0x12 Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int _Newsize, bool _Trim) Zeile 1963 + 0x13 Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Right, unsigned int _Roff, unsigned int _Count) Zeile 902 + 0xe Bytes C++
LogoColorDetector.exe!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Right) Zeile 546 C++
LogoColorDetector.exe!compareClasses(support::ImageCollection * coll, support::ImageClass * cl1, support::ImageClass * cl2, float * mean, float * var) Zeile 111 + 0x22 Bytes C++
Кто-нибудь имеет представление о том, что может вызвать это?
Спасибо за вашу помощь.
- редактировать -
Попробовал предложение с помощью Visual Leak Detector. Он ничего не показывает, пока не появится вышеупомянутое сообщение об ошибке, в котором говорится, что память была изменена после освобождения. Есть ли способ узнать, какой объект был связан с адресом памяти - дамп памяти кажется не очень полезным.
Чтобы сделать вещи более загадочными, я попытался добавить следующую строку:
std::string tmp = imgTrain2[j]->getFilepath();
std::string t2Path = imgTrain2[j]->getFilepath();
Теперь первая строка выполнена правильно, а вторая строка не выполнена.