QString的生命周期问题

Lifetime issues of QString

本文关键字:问题 周期 生命 QString      更新时间:2023-10-16

我有一个这样的类:

class SomeClass {
    public:
        QString data;
        SomeClass(const QString &);
};

和.cpp文件中的

SomeClass::SomeClass(const QString &_data) {
    data = _data;
}

那么我这样使用它:

SomeClass c("foobar");

这将调用QString("foobar")并将其传递给SomeClass的构造函数。但是这个QString是一个自动对象,所以它的生命周期将在构造函数之后结束。另一方面,data不会被复制(据我所知Qt文档),除非修改。这段代码是否可能有终身问题,还是我错了?如何设计得更好?

一切正常。当您销毁您的临时QString数据被修改时,将执行复制。数据修改意味着它可以在任意方向被修改,可以是引用数据的字符串,也可以是包含数据的字符串。

您的代码没问题。事件顺序为:

    当你将const char* "foobar"传递给构造函数时,会创建一个临时的QString(让我们称之为xx)。
  1. data被赋值该字符串,即data和xx都引用了字符串主体,现在该字符串主体的refcount为2
  2. xx超出作用域,字符串主体的refcount变为1,数据仍然引用该主体。