2

我有这样的课:

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 文档)。这段代码是否可能存在终身问题,还是我错了?如何更好地设计?

4

2 回答 2

5

一切正常。当您销毁临时 QString 数据时,数据被修改,因此将执行复制。数据修改意味着它将在任何一侧被修改,在引用数据的字符串中或在包含数据的字符串中。

于 2011-07-08T11:14:40.983 回答
4

你的代码没问题。事件的顺序是:

  1. 当您将 const char* "foobar" 传递给构造函数时,会创建一个临时 QString(我们称之为 xx)
  2. data 分配给该字符串,即 data 和 xx 都引用现在具有 ref 计数为 2 的字符串主体
  3. xx 超出范围,字符串主体的引用计数变为 1,数据仍然引用此主体。
于 2011-07-08T11:19:41.103 回答