从函数返回一个QString - 线程安全吗?

TSG*_*TSG 3 c++ qstring qt function return-value

我是Qt的新手 - 但这可能是一个非常基本的c ++问题.我有一个返回QString的简单函数:

QString testclass::myfunc(int i)
{
    QString result;
    switch (i) {
    case 1: result = "one"; break;
    case 2: result = "two"; break;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这样安全吗?c编译器是否确保返回值在内存中保留足够长的时间以供调用函数使用?(或者这会冒内存损坏的风险).如果是后者,返回QString的正确方法是什么?(结果var必须是静态的吗?结果必须是testclass的成员吗?)

QString包含常量是否重要?(id case 3分配给随机字符串的结果)

如果myfunc是一个静态方法,我想从不同的线程调用怎么办?我是否必须通过引用传入额外的Qstring以确保每个调用者获得自己的变量(并返回void)?


这是实际的功能(清理了一下) - 并注意到这个功能是STATIC,以防有所不同:

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;
}
Run Code Online (Sandbox Code Playgroud)

然而valgrind抱怨(第121行是'levelStr ="one";')

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&amp;) in <a 
Run Code Online (Sandbox Code Playgroud)

phy*_*att 5

http://qt-project.org/doc/qt-5/qstring.html#details

QString类提供Unicode字符串.

QString存储一串16位QChars,其中每个QChar对应一个Unicode 4.0字符.(代码值高于65535的Unicode字符使用代理项对存储,即两个连续的QChars.)

Unicode是一种国际标准,支持当今使用的大多数书写系统.它是US-ASCII(ANSI X3.4-1986)和Latin-1(ISO 8859-1)的超集,并且所有US-ASCII/Latin-1字符在相同的代码位置都可用.

在幕后,QString使用隐式共享(copy-on-write)来减少内存使用并避免不必要的数据复制.这也有助于减少存储16位字符而不是8位字符的固有开销.

除了QString之外,Qt还提供了QByteArray类来存储原始字节和传统的8位'\ 0'终止字符串.对于大多数用途,QString是您要使用的类.它在整个Qt API中使用,如果您想在某个时候扩展应用程序的市场,Unicode支持可确保您的应用程序易于翻译.QByteArray适用的两个主要情况是当您需要存储原始二进制数据时,以及何时保持内存(如嵌入式系统).

基本上QString很棒,几乎无后顾之忧.您可以随时随地使用它,无论您喜欢什么.如果您是从太频繁追加字符串运行到​​任何形式的放缓,有使用字符串生成一种特殊的方式,但在我的经验,也有很多其他地方努力让更好的QString的前改善.

并直接回答您的问题:

这样安全吗?c编译器是否确保返回值在内存中保留足够长的时间以供调用函数使用?(或者这会冒内存损坏的风险).如果是后者,返回QString的正确方法是什么?(结果var必须是静态的吗?结果必须是testclass的成员吗?)

在上述所有情况中,都是安全的.只要任何函数具有QString的句柄,共享指针等就会将其保留在内存中.一旦它完全超出范围,它将自我清理.

QString包含常量是否重要?(id case 3分配给随机字符串的结果)

不,没关系.

如果myfunc是一个静态方法,我想从不同的线程调用怎么办?我是否必须通过引用传入额外的Qstring以确保每个调用者获得自己的变量(并返回void)?

你应该用交叉线程保护包装它,例如a QMutexLocker.

更新:QMutexLocker示例

// In your constructor

m_mutex = new QMutex();


// When accessing a shared element across threads

{
    QMutexLocker locker(m_mutex);
    // Accessing a variable is now threadsafe!
    m_sharedDataString += "!";
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.