QVector :: replace () создает глубокую копию? - PullRequest
0 голосов
/ 08 сентября 2011

В моем приложении есть утечка памяти, которую я писал с помощью Qt (C ++).И я подозреваю, что проблема с этой линией.

for(int i=0; i<DATA_LENGTH;i++){
        cdata1->replace(i,data->at(i));    
}

cdata1 - QVector, данные - QList .

По той причине, что я использую replace (), у меня постоянная длина данных.И я не хотел создавать QVector каждый раз.QVector инициализируется в конструкторе объектов следующей строкой:

cdata1 = new QVector<double>(DATA_LENGTH,0);

Документация Qt гласит:

Обратите внимание, что использование неконстантных операторов может привести к тому, что QVector сделает глубокое копирование.

То, что я спрашиваю, вызывает ли функция replace () глубокое копирование или как я могу это понять?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Глубокая копия означает весь контейнер, а не элементы. В связи с этим, после предложения, которое вы цитировали, QVector использует неявное совместное использование , также известное как копирование при записи. Копии контейнера, доступные только для чтения, дешевы, так как внутренние ресурсы являются общими, пока одна из копий не будет изменена:

QVector<A> vec1;
...
QVector<A> vec2 = vec1; //cheap, only copies a pointer internally. vec1 and vec2
int siz2 = vec2.size();  //cheap, doesn't modify vec2, vec1 and vec2 are still the same object, internally
vec2[0] = something; //potentially expensive: modifies vec2, thus vec2 "detaches" from vec1, getting its own copy of vec1's internal data, which is then modified by the assignment.

Это также причина, по которой создание контейнеров в куче является довольно бессмысленным (и недиоматическим) почти во всех случаях, и вы должны создавать их в стеке.

0 голосов
/ 08 сентября 2011

Да, он копирует ваши двойные значения.Но я не думаю, что двойные значения могут быть подвержены утечкам памяти, если вы не создадите их с помощью new?

В любом случае, в зависимости от окружающего кода вы можете заменить весь этот блок с помощью

cdata1 = data->toVector();

(см. http://doc.qt.nokia.com/latest/qlist.html#toVector)

В качестве дополнительной подсказки вы должны начать использовать более читаемые имена переменных, чем cdata1 или data. Ваши переменные должны описывать то, что они хранят, например, если у вас естьсписок, хранящий точки данных о температуре, он должен называться чем-то вроде TemperatureDataPoints или TemperatureDataPointList. Он, конечно, включает в себя больше ввода, чем «данные», но вы не пожалеете об использовании более читаемых имен, если вы посмотрите на свой код через год или около того.1012 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...