Russian Qt Forum
Сентябрь 21, 2024, 09:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при работе с QDomElement  (Прочитано 5910 раз)
Mike
Гость
« : Июль 13, 2006, 10:03 »

У меня есть класс. В одной из его процедур я делаю так:
Код:
QDomElement Rt = Doc.documentElement();
QDomElement elt = Rt.firstChildElement("Title");
if (elt.isNull())
{
mTitle = mMapName;
}
else
{
mTitle = elt.text();
}

Затем, когда этот объект разрушается, вываливается ошибка. Если же строчку mTitle = elt.text(); заменить на что-то типа mTitle = "123";, все работает нормально.
В чем косяк?
Записан
Dair
Гость
« Ответ #1 : Июль 13, 2006, 12:54 »

mTitle какого типа?.. QString?
Записан
Mike
Гость
« Ответ #2 : Июль 13, 2006, 13:43 »

QString.
Я думал, что это из кода и так понятно. :-)
Записан
Dair
Гость
« Ответ #3 : Июль 13, 2006, 13:51 »

А ошибка в освобождении незанятой памяти?
А версия Qt какая?
Записан
Mike
Гость
« Ответ #4 : Июль 13, 2006, 14:29 »

Qt 4.0.0
Ошибка:
Unhandled exception at 0x77f767cd in MapViewer.exe: User breakpoint.
Стек:
    ntdll.dll!77f767cd()    
    ntdll.dll!77fa2612()    
    ntdll.dll!77f881c0()    
    ntdll.dll!77f6a6a0()    
    kernel32.dll!77e75b6c()    
    kernel32.dll!77e6c75a()    
>   msvcr71d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x00aa66a8)  Line 1807   C
    msvcr71d.dll!_free_dbg_lk(void * pUserData=0x00aa66a8, int nBlockUse=1)  Line 1132 + 0x9   C
    msvcr71d.dll!_free_dbg(void * pUserData=0x00aa66a8, int nBlockUse=1)  Line 1070 + 0xd   C
    msvcr71d.dll!free(void * pUserData=0x00aa66a8)  Line 1025 + 0xb   C
    QtCored4.dll!qFree(void * ptr=0x00aa66a8)  Line 1090 + 0xd   C++
    QtCored4.dll!QString::free(QString::Data * d=0x00aa66a8)  Line 785 + 0x9   C++
    QtCored4.dll!QString::~QString()  Line 682 + 0x23   C++
    MapViewer.exe!cMap::~cMap()  Line 12 + 0x10   C++
    MapViewer.exe!cMap::`scalar deleting destructor'()  + 0xf   C++
    MapViewer.exe!cMapList::~cMapList()  Line 14 + 0x21   C++
    MapViewer.exe!cMapList::`scalar deleting destructor'()  + 0xf   C++
    MapViewer.exe!cMainWindow::~cMainWindow()  Line 43 + 0x1f   C++
    MapViewer.exe!main(int argc=1, char * * argv=0x003d5ef0)  Line 17 + 0x15   C++
    MapViewer.exe!WinMain(HINSTANCE__ * instance=0x00400000, HINSTANCE__ * prevInstance=0x00000000, char * __formal=0x00141f16, int cmdShow=1)  Line 105 + 0x12   C++
    MapViewer.exe!WinMainCRTStartup()  Line 390 + 0x39   C
    kernel32.dll!77e814c7()
Записан
Mike
Гость
« Ответ #5 : Июль 14, 2006, 10:38 »

Решение проблемы:
Код:
QDomElement Rt = Doc.documentElement();
QDomElement elt = Rt.firstChildElement("Title");
if (elt.isNull())
{
    mTitle = mMapName;
}
else
{
   mTitle = elt.text() + "";
}

Весь косяк в том, что оператор = (так же как и конструктор копирования, как написано в документации) просто ссылается на присваемую строку и только после ее изменения делает копию. А я в своей программе строку не менял, вот и была ошибка.
Правда код смотрится очень криво. :-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.186 секунд. Запросов: 21.