【发布时间】:2014-08-28 05:27:43
【问题描述】:
我是 Qt 新手——但这可能是一个非常基本的 C++ 问题。我有一个返回 QString 的简单函数:
QString testclass::myfunc(int i)
{
QString result;
switch (i) {
case 1: result = "one"; break;
case 2: result = "two"; break;
}
return result;
}
这样安全吗? c 编译器是否确保返回值在内存中保留足够长的时间以供调用函数使用? (或者这是否会导致内存损坏)。如果是后者,返回 QString 的正确方法是什么? (结果变量必须是静态的吗?结果必须是测试类的成员变量吗?)
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;
}
然而 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&) in <a
【问题讨论】:
-
这个函数返回对象(不是对象上的指针),所以它是安全的(因为有一个 QString 的复制构造函数会将局部变量
result的内容复制到调用者的外部变量中) -
我是这么认为的....但是看看我上面添加的 valgrind 输出
-
我最近升级到了最新的 qt (5.3.1),突然间我在 Qt 中的 valgrind 向我展示了很多让我摸不着头脑的漏洞。如果有已知的 Qt/valgrind 问题,请告诉我。
-
如果您收到大量 valgrind 泄漏报告,那么我首先怀疑您的 Qt Creator、Qt 开发库和/或 valgrind 过滤器在某种程度上不匹配。您可以尝试创建最短的代码来为您获取报告,然后请其他人对其进行测试。或者(重新)安装 Qt SDK 并使用它和它附带的 Qt Creator(而不是你的 Linux 发行版的 Qt Creator 和 Qt dev libs 包)。
-
我正在使用直接从 Qt 下载的 Qt SDK (5.3.1),以及可用于我的发行版 (Fedora 20) 的最新 valgrind。有没有办法确认兼容性?
标签: c++ qt function return-value qstring