如何在 std::vector 中使用 QString 资源时释放它



我的数据集的每条记录都有一个结构"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
....

我想控制此内存使用情况。这就是为什么我不想使用r.insertr.erase.

当我需要插入记录时,我将:

  1. 将 r 的大小增加 r.resize(..);r.shrink_to_fit()(如果需要)。
  2. 将 r 的元素向右移动(如果需要)std::rotate
  3. 输入新值:r[i].ip_i=...;r[i].ip_addr=...

当我需要删除记录时,我将:

  1. 将 r 的元素向左移动(如果需要)按 std::rotate 。例如,std::rotate(r.begin()+i,r.begin()+i+1,r.begin()+rc); .
  2. 免费r[rc].ip_addr资源 .如何释放QString r[rc].ip_addr的资源?我尝试执行r[i].ip_addr.~QString()并捕获了运行时错误。
  3. 制作r.resize()(如果需要)。

我不想因为删除行后保留 Qstring 副本而丢失内存。

如何控制它们?

谢谢。

QString为您

处理所有内存控制。只要把它当作一个普通的对象,你就会没事的。 std::vector是 OO 感知的,因此它将在释放元素时调用析构函数。

您唯一不应该做的是使用低级内存操作例程,例如 memcpymemset . std::vector操作是安全的。

如果您确实想为[0..size-1]范围内的记录释放字符串(也就是说,在移动元素后实际上并没有随着resize()减小大小),那么调用r[i].ip_addr.clear()就足够了。或者更好的是,在您的结构中引入将调用ip_addr.clear()clear() 方法(以防您添加更多需要清除的字段)。但是您只能在有效记录上调用它,当然,不能超出实际向量大小的记录(无论底层容量是多少,它都只是一个实现细节)。

附带说明一下,使用QList可能是有意义的,因为无论如何您都在使用 Qt,除非您有特定的原因使用 std::vector 。就内存控制而言,QList提供了reserve方法,可让您根据需要保留尽可能多的元素。然后插入看起来像

list.reserve(list.size() + 1);
list.insert(i, r);

最新更新