Russian Qt Forum

Qt => XML => Тема начата: Mike от Июль 13, 2006, 10:03



Название: Ошибка при работе с QDomElement
Отправлено: 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";, все работает нормально.
В чем косяк?


Название: Ошибка при работе с QDomElement
Отправлено: Dair от Июль 13, 2006, 12:54
mTitle какого типа?.. QString?


Название: Ошибка при работе с QDomElement
Отправлено: Mike от Июль 13, 2006, 13:43
QString.
Я думал, что это из кода и так понятно. :-)


Название: Ошибка при работе с QDomElement
Отправлено: Dair от Июль 13, 2006, 13:51
А ошибка в освобождении незанятой памяти?
А версия Qt какая?


Название: Ошибка при работе с QDomElement
Отправлено: Mike от Июль 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()


Название: Ошибка при работе с QDomElement
Отправлено: Mike от Июль 14, 2006, 10:38
Решение проблемы:
Код:
QDomElement Rt = Doc.documentElement();
QDomElement elt = Rt.firstChildElement("Title");
if (elt.isNull())
{
    mTitle = mMapName;
}
else
{
   mTitle = elt.text() + "";
}

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