从函数 - 线程安全的QSTRING返回QString?

问题描述 投票:0回答:1
QString testclass::myfunc(int i) { QString result; switch (i) { case 1: result = "one"; break; case 2: result = "two"; break; } return result; }

这是安全的吗? C编译器是否确保返回值停留在内存中足够长的时间以至于通话函数使用? (或这种风险记忆损坏)。 如果后者,返回QString的正确方法是什么? (结果VAR必须是静态的吗?结果是否必须是测试频道的成员VAR?)

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&amp;) 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&lt;QArrayData::AllocationOption&gt;) 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

	

https://doc.qt.io/qt-5/qtring.html#details

c++ qt function return-value qstring
1个回答
5
投票
QString类提供一个Unicode字符串。

qString存储一个16位QCHAR的字符串,每个QCHAR对应 一个Unicode 4.0字符。 (上面具有代码值的Unicode字符 65535使用替代对存储,即连续两个QCHAR。) Unicode是支持大多数写作的国际标准 今天使用的系统。它是US-ASCII的超集(ANSI X3.4-1986) 和Latin-1(ISO 8859-1),所有us-ascii/latin-1字符is 在相同的代码位置可用。 beoshind behind,QString使用隐式共享(抄写) 减少内存使用情况并避免不必要的数据复制。这 还有助于减少存储16位字符的固有开销 而不是8位字符。

在QSTRING中,QT还提供了QByTearray类以存储 原始字节和传统的8位''终止字符串。对于大多数 目的,QString是您要使用的类。它始终使用 QT API和Unicode支持确保您的应用程序 如果您想扩展应用程序的 在某个时候。 QByTearray的两个主要情况 适当的是您需要存储原始二进制数据以及何时 记忆保护至关重要(就像在嵌入式系统中一样)。
基本上的QString很棒,几乎没有担心。 您可以在任何地方使用它,随心所欲。 如果您经常遇到任何类型的放慢脚步,那么有一种特殊的方法可以使用字符串构建器,但是根据我的经验,在尝试更好地改善QString之前,还有很多其他改进的地方可以改进。

直接回答您的问题:

这是安全的吗? C编译器是否确保返回值停留在内存中足够长的时间以至于通话函数使用? (或这种风险记忆损坏)。如果后者,返回QString的正确方法是什么? (结果VAR必须是静态的吗?结果是否必须是测试频道的成员VAR?)

在上述上述所有案例中,都是安全的。 只要任何函数都有QString的手柄,共享的指针等将其保存在内存中。 一旦它完全超出范围,它就会清理自身。 QSTRING包含常数很重要吗? (哪些ID案例3分配给随机字符串的结果)

没有,没关系。

如果MyFunc是我想从不同线程调用的静态方法,该怎么办?我是否必须通过参考来传递额外的QString,以确保每个呼叫者都有自己的变量(并返回void)?

您应该用跨线保护包裹它,例如

QMutexLocker

update: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 += "!"; }

希望有帮助

QString

是一个价值类,如果您无法从函数中返回它,那将是没有用的。这里没有什么不同。两者都可以按照您的演示方式使用。

您所指的“ const字符串”的概念是虚构的。没有这样的东西。语句

std::string

不会产生以某种方式的字符串。这不是C,您不会返回

result = "foo";

-并且出于充分的理由。

线程安全方面与字符串无关。您显示的方法主体可能是静态方法,因为它不使用任何实例的数据。它也是一个纯粹的功能,根本无法访问任何共享状态。从定义上讲,这种纯函数是线程安全的,因为它们无法访问共享状态。您可能希望通过一个更接近您的问题的示例来修改您的问题,并实际上证明了一些线程问题。

const char *

与其他QT隐式共享的值类一样,只要仅从一个线程访问它的特定实例

,就可以使用线程安全。该实例可能是从另一个字符串实例分配或复制的,没关系。例如:

QString

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.