почему компилятор откладывает освобождение std :: list?

У меня есть следующий код для проверки освобождения памяти с использованием контейнера std :: list:

#include <iostream>
#include <list>
#include <string>

#include <boost/bind.hpp>

/* count of element to put into container
 */
static const unsigned long SIZE = 50000000;

/* element use for test
 */
class Element
{
public:
    Element()
    : mId(0)
    {}
    Element( long id )
    : mId(id)
    {}
    virtual ~Element()
    {
    }
    inline long getId() const
    {
        return this->mId;
    }

    inline bool operator<( const Element & rightOperand ) const
    {
        return this->mId < rightOperand.mId;
    }

    inline bool isEven() const
    {
        return 0 == ( this->mId & 1 );
    }

private:
    long mId;
};

typedef std::list< Element > Elements;

int main( int argc, char * argv[] )
{
    std::string dummy;
    {
        Elements elements;

        std::cout << "Inserting "<< SIZE << " elements in container" << std::endl;
        std::cout << "Please wait..." << std::endl;

        /* inserting elements
         */
        for( long i=0; i<SIZE; ++i )
        {
            elements.push_back( i );
        }

        std::cout << "Size is " << elements.size() << std::endl;
        std::getline( std::cin, dummy); // waiting user press enter

        /* remove even elements
         */
        elements.remove_if( boost::bind( & Element::isEven, _1 ) );

        std::cout << "Size is " << elements.size() << std::endl;
        std::getline( std::cin, dummy);
    }

    std::getline( std::cin, dummy);

    return 0;
}

Выполнение этого кода дает Мне нужен следующий профиль памяти:

MemoryProfile

Похоже, что gcc откладывает освобождение, и в моей тестовой программе в конце у него нет выбора и освобождает память перед тем, как вернуться в командную строку.

Почему освобождение памяти происходит так поздно?

Я пробовал с вектором протестировать другой контейнер, и уловки сужения по размеру работают и освобождают освобожденную память, когда я этого ожидаю.

gcc 4.5.0, linux 2.6.34

6
задан Nelstaar 8 November 2011 в 13:11
поделиться