C ++对象分配和释放

时间:2014-08-04 18:12:20

标签: c++ vector getrusage

以下程序在一个循环中创建对象并将引用存储在向量中以供将来删除。

我看到一种不寻常的行为,即使对象在第二次迭代中被删除,getrusage也会提供比对象创建更高的驻留内存。

执行环境在Linux Kernel 3.2.0-49-generic中。

#include <iostream>
#include <vector>
#include <stdio.h>

#include <mcheck.h>
#include <sys/time.h>
#include <sys/resource.h>

using namespace std;

void printUsage(string tag)
{
    struct rusage usage;
    getrusage(RUSAGE_SELF, &usage);
    printf("%s -- Max RSS - %ld\n", tag.c_str() ,usage.ru_maxrss);
}

class MyObject
{
    public:
        char array[1024 * 1024];
        MyObject() {};
        ~MyObject() {};

};


int main()
{
    printUsage("Starting");

    vector<MyObject *> *v = new vector<MyObject *>();

    for(int i = 0; i < 10000; i++)
    {
        MyObject * h = new MyObject();

        v->push_back(h);

        // The max resident value is same. usual behavior.
        // delete h;
    }

    printUsage("After Object creation");

    for(size_t i = 0; i < v->size(); i++)
    {
        MyObject * h =  v->at(i);
        delete h;
    }

    v->clear();

    delete v;

    printUsage("After Object deletion");

    return 0;

}

g++ test/test.cpp  -Wall -O2 -g

输出

Starting -- Max RSS - 3060
After Object creation -- Max RSS - 41192
**After Object deletion -- Max RSS - 41380**

1 个答案:

答案 0 :(得分:1)

我不了解getrusage的具体内容,但是从快速谷歌来看,它似乎是报告使用的 OS 资源。通常,管理malloc / new使用的内存的C ++运行时库将在需要时从OS请求大块内存,从该块中生成malloc请求,然后在所有块之后保持块分配被释放,因此有一些可以处理下一个请求而无需再次询问操作系统。