我的应用程序中有内存泄漏,我用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文档说
请注意,使用非const运算符可能会导致QVector深入 副本。
我要问的是,replace()函数会导致深层复制,或者我该如何理解?
答案 0 :(得分:2)
深层复制是指整个容器,而不是元素。在您引用的句子之后链接,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.
这也是为什么在几乎所有情况下在堆上创建容器都是荒谬的(并且是单一的)并且你应该在堆栈上创建它们的原因。
答案 1 :(得分:0)
是的,它会复制您的双倍值。但我不认为双重值可能会受到内存泄漏的影响,除非您使用new
创建它们?
无论如何,根据您的周围代码,您可以使用
替换整个块cdata1 = data->toVector();
(见http://doc.qt.nokia.com/latest/qlist.html#toVector)
作为附加提示,您应该开始使用比cdata1
或data
更易读的变量名称。您的变量应描述它们存储的内容,例如:如果你有一个存储温度数据点的列表,它应该被称为temperatureDataPoints或temperatureDataPointList。当然,它涉及的输入比“数据”更多,但如果你在一年左右的时间内查看代码,你就不会后悔使用更易读的名字。