我一直在用 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 文档说
Note that using non-const operators can cause QVector to do a deep copy.
我要问的是 replace() 函数是否会导致深层复制,或者我该如何理解?
最佳答案
深拷贝意味着整个容器,而不是元素。正如您引用的句子后面的链接,QVector 使用 implicit sharing ,也称为写时复制。容器的只读拷贝很便宜,因为内部是共享的,直到其中一个拷贝被修改:
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.
这也是为什么在几乎所有情况下在堆上创建容器都相当荒谬(而且不合常理)的原因,而您应该在堆栈上创建它们。
关于c++ - QVector::replace() 是否创建深拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7345981/