What changed with QString::toStdString() in QT6?
-
@Christian-Ehrlicher said in What changed with QString::toStdString() in QT6?:
Can you print a std::string which is not created from a QString to std::cout?
it is what I am trying to do.
-
@Dmitriano
No, @Christian-Ehrlicher is suggesting you start by removing all your Qt stuff here and just checking how it behaves with nothing butstd::string
, which you have not reported so far. -
@Dmitriano said in What changed with QString::toStdString() in QT6?:
I do not link libraries except
Where do you think the
std
libraries and the run-time I/O libraries etc. come from? You're not doing a completely static build, are you?In any case, have you tried without any Qt anything, just to see what the behaviour is?
-
@Dmitriano said in What changed with QString::toStdString() in QT6?:
it is what I am trying to do.
Not in your example code. There you create the std::string from a QString instead a plain const char * as I suggested.
-
This post is deleted!
-
@Christian-Ehrlicher said in What changed with QString::toStdString() in QT6?:
Not in your example code. There you create the std::string from a QString instead a plain const char * as I suggested.
The program below works:
int main(int argc, char *argv[]) { const std::string val = "QT6"; std::cout << val << std::endl; qDebug() << QString::fromStdString(val); return 0; }
but prints something strange:
QT6 "\u0010???\u001C\u0002"
also see EDIT1 with the link to my minimal example.
-
@JonB said in What changed with QString::toStdString() in QT6?:
In any case, have you tried without any Qt anything, just to see what the behaviour is?
To avoid starting a battle here I created a minimal example, see EDIT1.
-
I still think this has nothing to do with Qt. QString::toStdString() (and the called QByteArray::toStdString()) are fully inlined and therefore it does not matter how Qt is compiled at all.
Try out the following (which is what QString::toStdString() is doing)
QString s = "Qt6"; QByteArray ba = s.toUtf8(); std::string str1 = ba.data(); std::string str2 = std::string(ba.data(), ba.size()); // this is what QString::toStdString() is doing std::cout << qPrintable(s) << std::endl; std::cout << ba.data() << std::endl; std::cout << str1 << std::endl; std::cout << str2 << std::endl;
And try to compile with and without
/std:c++latest
-
@Christian-Ehrlicher with and without
/std:c++latest
: your code works, but my original example does not. -
The only difference is the const QString <-> QString now.
Ste through your debugger with F11 to see that only those two functions are called. -
@Christian-Ehrlicher Noticed that my original example works in Release configuration, but does not work in Debug. So probably the difference is that some copying or moving are optimized. Or probably something goes wrong if I link a debug version of the app with a release version of QT.
-
@Dmitriano said in What changed with QString::toStdString() in QT6?:
if I link a debug version of the app with a release version of QT.
You must not mix debug and release libraries on windows since they use a different MSVCRT
-
@Christian-Ehrlicher said in What changed with QString::toStdString() in QT6?:
You must not mix debug and release libraries on windows since they use a different MSVCRT
I suggested a library mismatch might be at issue earlier, but seemed to be told this was causing "To avoid starting a battle"....
I assume the OP means he has two quite separate builds of everything, with different, consistent compilation/linkage flags used throughout, and is not mixing anything debug with release at all.....
-
@Dmitriano
When I said earlier about Googlingqstring tostdstring crash
and the stackoverflow post, there is https://stackoverflow.com/a/15611383/489865Your Qt DLLs need to be compiled with STL support and exactly the same C-Runtime Library as your code. It looks as though you are using two different CRTs at the same time, which would destroy the objects created on one heap by Qt into the heap used by your program.
Check the DLL Usage with the Dependency Walker!
That is what I had in mind, about the "same C-Runtime Library".
Do you have the Windows Dependency Walker? It's a useful tool! If you run it on the misbehaving executable, check carefully for all the dependent libraries. If you see both debug and non-debug versions of things like MSVCRT involved, you have a problem! Everything, including your Qt libraries, must be compiled either for release or for debug, no mixture. Might that be the situation you are in?
-
@JonB said in What changed with QString::toStdString() in QT6?:
Everything, including your Qt libraries, must be compiled either for release or for debug, no mixture. Might that be the situation you are in?
Yes, it is exactly the situation I was in. And I was in the same situation with QT5, but it did not crash.
-
@Dmitriano said in What changed with QString::toStdString() in QT6?:
And I was in the same situation with QT5, but it did not crash.
Point taken, but that's a bit hit-or-miss. But since you have closed this thread I guess you are saying that sticking to release- or debug-only for everything has resolved your problem?
-
I had many problems with this myself when we started converting from wxWidgets to Qt. In that case it was some library mismatches. (In our case it was dynamic and static linking instead of release and debug.) Sometimes it has also to do with C++11 and C++98 being mixed.
However, our solution was to call
str.toUtf8().data()
. This has always worked. Also, it ensures that output, writing to text files, etc. is always UTF8 (which I believe it will not if usingstr.toStdString()
). In addition on Windows (and only Windows!!) we callsetlocale(LC_ALL, ".UTF8");
right at the beginning of main. This lets Windows know that all output onstd::cout
is actually UTF8. -
@JonB said in What changed with QString::toStdString() in QT6?:
I guess you are saying that sticking to release- or debug-only for everything has resolved your problem?
Yes, I built release and debug versions of QT6.2RC1. If I build debug app with debug QT and release app with release QT it does not crash.