Jac*_*ieg 1 c++ qt memory-management stl qvector
说我有一个QVector,我为420000元素调用QVector :: reserve.在那之后我又打电话QVector::reserve给42个元素.我注意到,在执行此操作后,该进程仍然为这些420000个元素分配了内存.当我将QVector大小缩小到42 时,为什么内存不会被释放?
请使用以下代码:
#include <QCoreApplication>
#include <QVector>
#include <QDebug>
typedef QVector<QPointF> PointVec;
typedef QList<PointVec*> PointVecList;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Processing...";
PointVecList list;
for (int i = 0; i < 4200; i++) {
PointVec *v = new PointVec();
v->reserve(420000);
v->resize(420000);
v->reserve(42);
v->resize(42);
list.append(v);
}
qDebug() << "End of processing...";
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
此代码在32位系统上崩溃抛出std::bad_alocexception(Unhandled exception at 0x7729C41F in QtConsoleApplication1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0034F5E8.)(因为系统不支持一个进程的大量RAM).
但是,如果我评论行v->reserve(420000);,v->resize(420000);一切正常.这就是我注意到如果我调用v->reserve(42);并且v->resize(42);(在事先保留/调整向量大小为420000个元素之后)超出内存的方法就不会被释放.
我还注意到的是,std::vector行为完全一样.
是否有可能强制Qt释放内存?如果没有,是否有可能以某种方式手动释放它?
除非存在实际的内存压力,否则底层库无法将已分配的内存实际释放回操作系统,而是将其保留并使用它来满足新的分配(不需要进行上下文切换以获取它无论如何你很快就会做出的内核).
操作系统也是如此.即使应用程序实际上释放了内存,在实际需要其他地方之前也没有必要进行实际回收它的工作(幸运的是,直到进程退出并且它只能对所有内容进行单个批量回收).
所以,原因是效率.实际上释放内存涉及成本,没有理由支付成本,直到你真的需要 - 在许多情况下永远不会.
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |