C ++删除对象不会释放内存

时间:2019-02-11 10:08:03

标签: c++ qt memory-management

我创建了以下代码,以检查如何使用qt和c ++分配和释放内存

平台:Linux,Ubunut 16.04

testmemeory.h

#include <QObject>

class testMemeory : public QObject
{
    Q_OBJECT
public:
    explicit testMemeory(QObject *parent = nullptr);
    void freeMEm();
    char* str;

};

testmemeory.cpp

testMemeory::testMemeory(QObject *parent) : QObject(parent)
{
        str = new char [30000];
}

void testMemeory::freeMEm(){
    delete [] str;
}

这是我用来存储对象的数组。

std::vector<testMemeory*> testList;

我正在使用

分配内存
void MainWindow::allocateMemory()
{
    for(int i=0;i<50000;i++){
        testMemeory *t = new testMemeory();
        testList.push_back(t);
    }

    qDebug()<<"Memory allocated..";
}

然后使用释放内存

void MainWindow::relaseMemory()
{
    for(int i=0;i<testList.size();i++)
        testList.at(i)->freeMEm();

    qDeleteAll(testList);
    testList.clear();

    qDebug()<<"Memory freed..";

}

当我分配内存时,用于该应用程序的RAM从150MB增加到了约350MB,就好像调用relaseMemory()函数一样,RAM仍然是350 MB,并且没有减少到150 MB

可能是什么原因。

1 个答案:

答案 0 :(得分:2)

通常,当应用程序需要内存时,它将从进程内内存舞台请求内存,如果内存不足,则舞台将从主机环境中获取更多。然后根据需要将其从竞技场分发出去。

应用程序完成一点内存后,会将其交还给竞技场以供以后分配。通常不会从竞技场移交给主持人。

因此,如果您要从主机的角度来衡量为应用程序分配了多少内存,它会上升但不会下降,至少直到应用程序退出为止,这时会返回所有 进程内存。

换句话说,是这样的:

+-------------+               +-------+
|             | <- allocate - |       |             +------+
| application |               | arena | <- obtain - | host |
|             | --- free ---> |       |             +------+
+-------------+               +-------+                 ^
\_____________________________________/                 |
                   |                                    |
                   +------ all handed back on exit -----+