Жизненные проблемы QString - PullRequest
1 голос
/ 08 июля 2011

У меня есть такой класс:

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), если не будет изменено.Возможно ли иметь пожизненные проблемы с этим кодом или я ошибаюсь?Как его оформить лучше?

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Все в порядке.Когда вы уничтожаете, ваши временные данные QString изменяются, поэтому копирование будет выполняться.Изменение данных означает, что они будут изменены с любой стороны, в строке, которая ссылается на данные, или в строке, которая содержит данные.

4 голосов
/ 08 июля 2011

Ваш код в порядке. Последовательность событий:

  1. временная строка QString (давайте назовем ее xx) создается, когда вы передаете const char * "foobar" в конструктор
  2. данным присваивается эта строка, т. Е. И данные, и xx ссылаются на тело строки, в котором теперь счетчик ссылок равен 2
  3. xx выходит за рамки видимости, счетчик ссылок тела строки равен 1, а данные все еще ссылаются на это тело.
...