ASSERT failure in QList<T>::at: "index out of range"
-
Hi,
Did you check that you call doDownload with an non-empty QStringList ?
Also, why use QVariant if you will only handle string list in that method ?
On a side note, you have a memory leak, each time that function is called you create a new QNetworkAccessManager but never delete it. All instances will get destroyed when their parent also is but in between they will slowly fill your memory.
-
Did you also check the value of
current
? -
Hi @Qjay
Where do you initialise
dbmanager::current
? And, are you re-using thedbmanager
instance?eg:
d->doDownload(one_set_of_down_links); // later d->doDownload(another_set_of_down_links);
In which case you might need to be explicitly resetting
dbmanager::current
to0
? (and if the second list was smaller than the first, you will get the exception you've shown)Cheers.
-
hi @Paul like in my case
dbmanager *d = new dbmanager(0) ; d->doDownload(down_links); dbmanager *p = new dbmanager(0) ; p->png_download(png_down_links, png_hash);
i use
int current= 0 // for doDownload(down_links)
png_curr = 0; // for png_downloadhere is the whole code of the .cpp file
-
Yes i check the value of current .
it is in global scope and i have initialized it to 0
int current = 0 ;
i have attached the full source code too
https://ghostbin.com/paste/rdfnb
and this is how i am calling the add function which calls save image and save file function
Item{ visible: false Text{ visible: false id: responsetext text:"" } } Button{ width: drawer.width height: 40 text:"save offline" onClicked: { responsetext.text = dbman.add(current_title); drawer.close(); } }
-
Why a global variable ?
If you have an out of range error this means that current goes higher than the size of the list your are accessing.
You are likely never reinitializing current. So it will work the first time however the second time, and unless your array gets bigger than current, it will fail.
-
@Qjay, how sure are you that the exception happens at this line?
QUrl url = v.toStringList().at(current);
Did the debugger break at this line?
The reasons I ask are,
- the output in your animated gif suggests (its not definitive) to me that the crash happens just after that point;
- its looks very likely to me, that the exception would be on this line:
png_filename = n.toStringList().at(png_curr);
Because the code in
dbmanager::png_download
is assuming thatn
(akapng_hash
) always has the same number (or rather, at least as many) items asv
(akapng_down_links
). But, while I see code that streams entries intopng_down_links
(insave_images
), I see no code anywhere that adds anything topng_hash
.I highly recommend you try out the debugger (if you haven't already), and also add some range-checking / debug logging in the
dbmanager::png_download
function.Cheers.
-
@Paul @SGaist , i don't know why but i am never able to initialize QUrl url :( ;
AND I BELIEVE THAT"S WHAT CAUSING THE PROBLEM
i have tried different approaches too . Like in my code i was using QStringList i even tried Qvector<QString> down_links and end result was same
NOT ABLE TO set QUrl
in console screen QUrl("") ""
What shoudl i do ?
-
Again, did you check that the value of current is lower than the size of the string list ?
-
@Qjay But is it changed somewhere?
Why not just check like this?qDebug() << v.toStringList().size() << current; qDebug() << v.toStringList().at(current); QUrl url = v.toStringList().at(current);
In such a situation this is actually the first thing to do...
-
hey @jsulm
i tried what you suggested
qDebug() << v.toStringList().size() << current; qDebug() << v.toStringList().at(current); QUrl url = v.toStringList().at(current);
i did this
qDebug() << "stringlist size and current" << v.toStringList().size() << current; qDebug() << "current url in stringlist" << v.toStringList().at(current); QUrl url = v.toStringList().at(current); qDebug() << "why break" << url;
output
stringlist size and current 33 0 current url in stringlist "(http://restbase.wikitolearn.org/en.wikitolearn.org/v1/media/math/render/svg/3cd95482da53d42c5f7f249454f7ee1e85cacc0c)" why break QUrl("") ""
and then error
ASSERT failure in QList<T>::at: "index out of range", file ../../Qt5.7.0/5.7/gcc_64/include/QtCore/qlist.h, line 537 The program has unexpectedly finished.
-
Looks like you are doing a lot of parsing, replacement etc.
The first thing I'd do, is to just ensure that you really have URLs in your list. And get rid of that QVariant parameter. It really doesn't make any sense in your use case.
-
Hello , thanks for the suggetions .
-
yes there were useless ( ) in url . i have removed them . Now i am able to assign url to Qurl :D great!!
-
i removed the Qvariant thing too
now the code is
.cpp : https://ghostbin.com/paste/vv2w7
header file : https://ghostbin.com/paste/8z4y3
but the assert error still exist :/
-
-
Still at the same place ?