Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/cplusplus11/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在std::vector中使用QString时如何释放它的资源_Qt_C++11_Vector - Fatal编程技术网

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

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/

我的数据集的每个记录都有一个结构“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//按键排序的行
int rc//行数
....
我想控制内存的使用。 这就是为什么我不想使用
r.insert
r.erase

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

  • 将r的大小增加
    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
    。 如何释放QString
    r[rc].ip_addr
    的资源? 我尝试执行
    r[I].ip\u addr.~QString()
    ,并捕获了一个运行时错误
  • 使
    r.resize()
    (如果需要)
  • 我不想丢失内存,因为删除行后保留了Qstring副本

    我怎样才能控制它们


    谢谢。

    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 size
    resize(…)
    来释放QStrings资源。对,或者查看我的上一次编辑,了解如何在不改变大小的情况下进行操作,如果您确实需要它(但我