Здравствуйте. Я правильно понимаю, что QVector хранит в себе копии присеваемых данных?
Скажем, для кода:
QVector<QString> sRow;
QString str("text");
sRow.append(str);
Верно то, что sRow будет хранить КОПИЮ str? И в принципе безопасно сделать вот так вот:
void AddValToRow(QVector<QString> &Row )
{
QString ddd("test");
Row.append(ddd);
}
безопасно, потому что хоть при выходе из AddValToRow стековая переменная ddd будет освобождена, копия ее будет находится в Row.
Однако я смотрю под отладкой, а внутренние данные объекта QString ddd и Row[0] имеют одинаковый адресс. под внутренними данными я подразумеваю переменную внутреннюю переменную QString, т.е. QString::Data *d. При этом по выходу из AddValToRow этот массив в экземпляра класса ddd не был уничтожен.
Получается QString умеет при копировании ссылаться на один и тот же массив данных в памяти? Т.е. там некий есть подсчет ссылок, и уничтожение на декструкторе происходит только когда счетчик ссылок 1 равен?
И еще вопрос — а какие тогда правила пользования QVector? Я так понимаю, что если нет конструктора копирования, для класса со сложными внутренними данными использование QVector может привести к ошибкам. Например, в случае, если бы из моего второго примера вместо QString был бы класс, в котором нет управления ссылками на внутренние данные и нет конструктора копирования, который делает полную копию внутренних данных объекта класса, то при выходе из функции AddValToRow внутренний указатель строку которую хранит QString был бы освобожден, и внутри Row была бы копия объекта, с неверным указателем на строку.