我对这个C ++代码不太确定。
#include <QList>
#include <QString>
using namespace std;
class MyClass {
public:
QList<QString> m_List;
MyClass() {
QString text1("foo1");
m_List << text1;
QString text2("foo2");
m_List << text2;
}
};
int main() {
MyClass myClass;
for (int i = 0; i < myClass.m_List.size(); ++i) {
cout << myClass.m_List.at(i).toStdString() << endl;
}
}
我不明白为什么它有效,因为我在构造函数的 QList 中创建并添加了 QString 。
所以,我的实例 text1 不应该在构造函数的末尾存在,当我在循环中访问 QList 元素时,这应该不起作用,但输出看起来不错:
foo1
foo2
cppcheck 对此代码不做任何说明 这段代码是对的吗?
答案 0 :(得分:1)
您的代码是正确的。
是的,本地实例不再存在。但那没关系。 QList按值存储数据。传递给QList的内容将被复制,副本将存储在列表中。因此,即使您的本地QString对象在离开构造函数时被丢弃,QList中的副本仍然存在。
答案 1 :(得分:0)
似乎对于QString,它将值存储在数组
中http://qt-project.org/doc/qt-5/qlist.html#details
在内部,QList表示为指向项目的指针数组 类型为T.如果T本身是指针类型或基本类型为否 大于指针,或者如果T是Qt的共享类之一,那么 QList将项直接存储在指针数组中。
另请查看:http://qt-project.org/doc/qt-5/implicit-sharing.html#list-of-classes