Unexpected QList behaviour with nested structures.
-
Following strustured types defined:
@typedef struct {
const char* str;
const QObject* obj;
} NObj;typedef struct {
NObj v1;
NObj v2;
} twoPairs;@then in some class I create private: QList<twoPairs> pairs;
All works fine until I try get values from this list.
I add data using this:
@tmp.v1.str = someptr1;
tmp.v1.obj = someptr2;
tmp.v2.str = someptr3;
tmp.v2.obj = someptr4; // here all is fine, fields are rightpairs << tmp; // unfortunately QtCreator doesn't show pairs content
@but while doing something like this
@foreach( twoPairs pair, pairs )
{
char* x1 = pair.v1.str; // is fine
QObject x2 = pair.v1.obj; // is fine
char* x3 = pair.v2.str; // ----CORRUPTED!!----
QObject x4 = pair.v2.obj; // is fine
}@And this appears while any other attempt to get structure from QList. Even in:
@ tmp = pairs.at(0);
char* x1 = tmp.v1.str; // is fine
QObject x2 = tmp.v1.obj; // is fine
char* x3 = tmp.v2.str; // ----CORRUPTED!!----
QObject x4 = tmp.v2.obj; // is fine
@What is wrong with these structures? Isn't that a bug in QList implementation? Anybody confirm?
-
Your code has a lot of bugs and won't even compile.
@char* x1 = pair.v1.str; // is fine@
No, this is not fine because you assign a const char* to a char* without a const cast.
@QObject x2 = tmp.v1.obj; // is fine@
No, this is even more worse because you assign a QObject pointer to a QObject instance.
From reading your code I'm not surprised that QList shows unexpectet behaviour. But maybe the QList programmer created a serious bug because he was tired after 14 hours of work. ;) -
Gourmand, this is the third topic in a short time where you claim very well tested Qt libs have bugs. Perhaps you should mind "this item":http://www.catb.org/~esr/faqs/smart-questions.html#id478549 from the "Smart Questions FAQ":http://www.catb.org/~esr/faqs/smart-questions.html.
-
@ const QObject* obj; @
You cannot have a const pointer and then assign to it normally. Only in the initializer list of constructor or when defining it. Either
@
const QObject* obj = <some_qobject_pointer>;
@or
@
struct ABC {ABC(QObject* obj_param) : obj(obj_param) { } const QObject* obj;
};
QObject* myObj = new QObject();
struct ABC a(myObj);
@Other issues in the code, you don't allocate memory anywhere..
Do this:@
struct ABC
{
char* str;
}struct ABC a;
a.str = strdup("your const char* string");
@strdup duplicates string, allocates memory and returns it.
If you say, it's solved, then could you add [ Solved ] in the title.
-
bq. You cannot have a const pointer and then assign to it normally.
You can't read? I already told - real code was different. I was after 14 hours of permanent work and entered wrong code here. All my tens of thousands lines work fine.
Anybody can close this thread?
-
[quote author="Gourmand" date="1308662520"]You can't read? I already told - real code was different. I was after 14 hours of permanent work and entered wrong code here. All my tens of thousands lines work fine.
Anybody can close this thread?[/quote]
People here are trying to help you Gourmand, so please be nice and watch what you write.
-MariusG
Admin