我是Qt的新手 - 但這可能是一個非常基本的C++問題。我有一個簡單的函數返回一個QString:從函數返回一個QString - 線程安全嗎?
QString testclass::myfunc(int i)
{
QString result;
switch (i) {
case 1: result = "one"; break;
case 2: result = "two"; break;
}
return result;
}
這是否安全? c編譯器是否確保返回值在內存中保留足夠長的時間以供調用函數使用? (或者這是否會損害內存損壞)。如果是後者,返回QString的正確方法是什麼? (結果var必須是靜態的嗎?結果是否必須是testclass的成員變量?)
QString是否包含常量? (什麼id情況3分配結果到一個隨機字符串)
如果myfunc是一個靜態方法,我想從不同的線程調用?我是否必須通過引用傳遞額外的Qstring以確保每個調用者都獲得自己的變量(並返回void)?
下面是實際的功能(清理了一下) - 並注意這個功能是靜態的情況下,使一個區別:
QString L::toString(const L::editions &level)
{
QString levelStr;
switch (level) {
case L::one:
levelStr = "one";
break;
case L::two:
levelStr = "two";
break;
case L::three:
levelStr = "thre";
break;
default:
levelStr = "Internal Error";
break;
}
return levelStr;
}
,但Valgrind的抱怨(線121「levelStr = 「一」;')
34 bytes in 1 blocks are definitely lost in loss record 197 of 716
in L::toString(L::edition const&) in /mnt/lserver2/data/development/haast/src/linfo.cpp:121
1: malloc in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
2: QArrayData::allocate(unsigned long, unsigned long, unsigned long, QFlags<QArrayData::AllocationOption>) in /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
3: QString::QString(int, Qt::Initialization) in /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
4: /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
5: QString::fromUtf8_helper(char const*, int) in /opt/Qt/5.3/gcc_64/lib/libQt5Core.so.5.3.1
6: QString::fromUtf8(char const*, int) in <a href="file:///opt/Qt/5.3/gcc_64/include/QtCore/qstring.h:492" >/opt/Qt/5.3/gcc_64/include/QtCore/qstring.h:492</a>
7: QString::operator=(char const*) in <a href="file:///opt/Qt/5.3/gcc_64/include/QtCore/qstring.h:609" >/opt/Qt/5.3/gcc_64/include/QtCore/qstring.h:609</a>
8: L::toString(L::Lconst&) in <a
該函數返回對象(對象上不指針),所以它是安全的(因爲有的QString的拷貝構造,這將複製局部變量的內容'result'到呼叫者的外部變量) – Ilya 2014-08-28 05:33:12
我是這麼認爲的....但看看Valgrind的輸出I以上 – TSG 2014-08-28 05:40:32
加我最近升級到最新的QT(5.3.1),突然我的Qt中Valgrind是顯示我,離開我抓我的頭泄漏的地段。如果知道Qt/valgrind問題,請告訴我。 – TSG 2014-08-28 05:55:03