Qt 在std::vector中使用QString时如何释放它的资源
我的数据集的每个记录都有一个结构“rs” 所有记录都在向量“r”中 我的记录计数是“rc”Qt 在std::vector中使用QString时如何释放它的资源,qt,c++11,vector,Qt,C++11,Vector,我的数据集的每个记录都有一个结构“rs” 所有记录都在向量“r”中 我的记录计数是“rc” .... struct rs{ uint ip_i;//index QString ip_addr;//ip address }; std::vector <rs> r;//rows ordered by key int rc;//row count .... 。。。。 结构rs{ uint ip_i;//索引 QString ip_addr;//ip地址 }; std::向量r/
....
struct rs{
uint ip_i;//index
QString ip_addr;//ip address
};
std::vector <rs> r;//rows ordered by key
int rc;//row count
....
。。。。
结构rs{
uint ip_i;//索引
QString ip_addr;//ip地址
};
std::向量r//按键排序的行
int rc//行数
....
我想控制内存的使用。
这就是为什么我不想使用r.insert
和r.erase
当我需要插入记录时,我将:
r.resize(..);r、 收缩到合适的位置()
(如果需要)std::rotate
将r的元素向右移动(如果需要)r[i].ip_i=。。。;r[i].ip地址=…
std::rotate
将r的元素向左移动(如果需要)。
例如,std::rotate(r.begin()+i,r.begin()+i+1,r.begin()+rc)代码>
r[rc].ip\u addr
。
如何释放QStringr[rc].ip_addr
的资源?
我尝试执行r[I].ip\u addr.~QString()
,并捕获了一个运行时错误r.resize()
(如果需要)谢谢。
QString
为您处理所有内存控制。只要把它当作一个普通的物体,你就会没事的std::vector
是面向对象的,因此在释放元素时它将调用析构函数
唯一不应该做的是使用低级内存操作例程,如memcpy
或memset
<代码>标准::向量操作是安全的
如果您确实想为[0..size-1]
范围内的记录释放一个字符串(也就是说,在移动元素后,您实际上不会使用resize()
减小大小),那么调用r[i].ip\u addr.clear()
就足够了。或者更好的方法是,在结构中引入clear()
方法,该方法将调用ip\u addr.clear()
(以防添加更多需要清除的字段)。但是,您只能在有效记录上调用它,当然,不能在超出实际向量大小的记录上调用它(无论底层容量如何,这只是一个实现细节)
另一方面,使用QList
可能是有意义的,因为您无论如何都在使用Qt,除非您有特定的理由使用std::vector
。就内存控制而言,QList
提供了reserve
方法,允许您保留所需的元素。那看起来像
list.reserve(list.size() + 1);
list.insert(i, r);
QString
为您处理所有内存控制。只要把它当作一个普通的物体,你就会没事的std::vector
是面向对象的,因此在释放元素时它将调用析构函数
唯一不应该做的是使用低级内存操作例程,如memcpy
或memset
<代码>标准::向量操作是安全的
如果您确实想为[0..size-1]
范围内的记录释放一个字符串(也就是说,在移动元素后,您实际上不会使用resize()
减小大小),那么调用r[i].ip\u addr.clear()
就足够了。或者更好的方法是,在结构中引入clear()
方法,该方法将调用ip\u addr.clear()
(以防添加更多需要清除的字段)。但是,您只能在有效记录上调用它,当然,不能在超出实际向量大小的记录上调用它(无论底层容量如何,这只是一个实现细节)
另一方面,使用QList
可能是有意义的,因为您无论如何都在使用Qt,除非您有特定的理由使用std::vector
。就内存控制而言,QList
提供了reserve
方法,允许您保留所需的元素。那看起来像
list.reserve(list.size() + 1);
list.insert(i, r);
QString
既是引用计数又是写时复制。因此,如果没有其他人引用它,它将被自动释放。你甚至不必关心这个问题,除非你正在其他地方泄漏内存。我说得对吗,QString的副本将一直保留在内存中,直到我将r的大小减小到QString被放置的下面?“我说得对吗”。。。现在呢?如果不再需要std::vector
中的QString对象,如何强制QString释放资源?它是可控的吗?QString有一个指向可变长度数据的指针。也许,只要将QString设置为“”,就足够了?QString
既是引用计数的,也是写时复制的。因此,如果没有其他人引用它,它将被自动释放。你甚至不必关心这个问题,除非你正在其他地方泄漏内存。我说得对吗,QString的副本将一直保留在内存中,直到我将r的大小减小到QString被放置的下面?“我说得对吗”。。。现在呢?如果不再需要std::vector
中的QString对象,如何强制QString释放资源?它是可控的吗?QString有一个指向可变长度数据的指针。也许,将QString设置为“”就足够了?我想控制std::vector
capacity()
size。这就是为什么我将resize()
与shorn\u to\u fit()
一起使用。当然,如果我使用insert
和erase
删除QString,所有操作都是正确的。但是我必须插入和删除行而不使用insert
和erase
resize()
将为您调用析构函数,并为超出新大小的元素释放内存(无论容量大小)。确定。这是可以接受的。因此,我需要使用递减r sizeresize(…)
来释放QStrings资源。对,或者查看我的上一次编辑,了解如何在不改变大小的情况下进行操作,如果您确实需要它(但我