Исключение при назначении строки из GDCM
У меня есть приложение Qt, которое я создаю с более новыми версиями VC++ и GDCM. Ранее я создавал приложение с VC++ 2015 и старой версией GDCM, и оно скомпилировалось и работало просто отлично. Теперь я сталкиваюсь с исключением в строковом присваивании.
gdcm::Reader r;
r.SetFileName(f.toStdString().c_str());
if (r.Read()) {
gdcm::StringFilter sf;
sf = gdcm::StringFilter();
sf.SetFile(r.GetFile());
std::string s;
/* get modality */
gdcm::Tag tag = gdcm::Tag(0x0008,0x0060);
s = sf.ToString(tag); // <-- runtime error here...
fileModality = QString(s.c_str());
/* get patientID */
s = sf.ToString(gdcm::Tag(0x0010,0x0020));
filePatientID = QString(s.c_str());
/* get protocol (seriesDesc) */
s = sf.ToString(gdcm::Tag(0x0008,0x103E));
fileProtocol = QString(s.c_str());
}
Если я использую assign
функция, ошибка перемещается на следующую строку, в преобразовании из строки в c_str.
s.assign(sf.ToString(tag));
fileModality = QString(s.data());
Я не уверен, что происходит, но, похоже, проблема в GDCM, который неправильно возвращает строковый объект.
Редактировать: ошибка представляет собой диалоговое окно со следующим
The inferior stopped because it triggered an exception.
Stopped in thread 0 by: Exception at 0x7ffaa7b8f621, code: 0xc0000005: read access violation at: 0xfffffffffff, flags=0x0 (first chance).
И стек вызовов, начиная с моего собственного вызова функции
1 std::_Container_base12::_Swap_all xutility 239 0x7ff7764a7b7a
2 std::_String_alloc<std::_String_base_types<char,std::allocator<char>>>::_Swap_all xstring 2029 0x7ff7764a7af7
3 std::string::_Assign_rv_contents_with_alloc_always_equal xstring 2353 0x7ff7764a619d
4 std::string::_Assign_rv_contents xstring 2326 0x7ff7764a6132
5 std::string::operator= xstring 2308 0x7ff7764a37cd
6 MainWindow::GetFileType mainwindow.cpp 477 0x7ff77648784c
... <More>
1 ответ
Я помещу это здесь на случай, если кто-нибудь столкнется с подобной проблемой.
Я смог выяснить проблему. GDCM был скомпилирован в Release... но мое приложение было скомпилировано в Debug. Каким-то образом он просто отлично связался и в основном работал, но когда он столкнулся с вызовом функции из библиотеки GDCM, он потерпел крах. Компилирование всего в Release или Debug исправило это.