Tengo el siguiente código para probar cancelación de asignación de memoria utilizando un recipiente std :: lista:por qué el compilador difiere std :: list desasignación?
#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;
}
La ejecución de este código me da el siguiente perfil de memoria:
Parece que es gcc posponiendo la desasignación y en mi programa de prueba, al final no tiene otra opción y desasignar la memoria antes de volver a la línea de comando.
¿Por qué el deslocalización ocurre tan tarde?
He intentado con un vector probar otro contenedor y los trucos de contracción funcionan y desasignan la memoria liberada cuando la esperaba.
gcc 4.5.0, Linux 2.6.34
¿Cómo se mide el consumo de memoria? – NPE