c++ - QVector::replace() 是否创建深拷贝?

标签 c++ qt

我一直在用 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/

相关文章:

c++ - 获取另一个指针类成员封装的指针类成员列表的索引值

c++ - 是否可以在 Qt Designer 中使用依赖注入(inject)(对于 .ui 文件)?

python - 如何清除 PyQt 中的绘图?

c++ - 调用 Sendinput 后​​,在最小化/最大化/关闭窗口按钮上鼠标指针卡住

C++ 构造函数与初始化列表速度比较

c++ - 指针类成员和删除职责

c++ - 创建一个函数来匹配 main 中的字符串

c++ - 更改文件名,包括 char 和 float

c++ - 获取主板序列号

qt - 如何将点击事件传递给Qt中的 sibling ?