我的数据集的每条记录都有一个结构"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.insert
和r.erase
.
当我需要插入记录时,我将:
- 将 r 的大小增加
r.resize(..);r.shrink_to_fit()
(如果需要)。 - 将 r 的元素向右移动(如果需要)
std::rotate
。 - 输入新值:
r[i].ip_i=...;r[i].ip_addr=...
当我需要删除记录时,我将:
- 将 r 的元素向左移动(如果需要)按
std::rotate
。例如,std::rotate(r.begin()+i,r.begin()+i+1,r.begin()+rc);
. - 免费
r[rc].ip_addr
资源 .如何释放QStringr[rc].ip_addr
的资源?我尝试执行r[i].ip_addr.~QString()
并捕获了运行时错误。 - 制作
r.resize()
(如果需要)。
我不想因为删除行后保留 Qstring 副本而丢失内存。
如何控制它们?
谢谢。
QString
为您处理所有内存控制。只要把它当作一个普通的对象,你就会没事的。 std::vector
是 OO 感知的,因此它将在释放元素时调用析构函数。
您唯一不应该做的是使用低级内存操作例程,例如 memcpy
或 memset
. 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);