Ошибка: std :: bad_alloc в ячейке памяти 0x0038fd50

Я написал код с использованием глобальной кучи. Мне нужно повторить одну и ту же операцию несколько раз. Каждый раз мне нужно очистить кучу и переназначить данные. но функция vector :: clear () не освобождает память. поэтому через некоторое время память заполняется и программа завершается.

#include "stdafx.h"#include <cstdio>
#include <vector>
using namespace std;

#define N 30000
typedef unsigned int uint;
class Node;
class Edge;
vector<Node*> nodes;
vector<Edge*> edges;

class Node
{
public:
Node(uint id): id(id)
{
nodes.push_back(this);
}
public:
uint id;
};

class Edge
{
public:
Edge(int nod1, int nod2)
: nodH(nod1), nodT(nod2)
{
edges.push_back(this);
}
bool Connects(Node* nod1, Node* nod2)
{
return (
(nod1->id == this->nodH && nod2->id == this->nodT) ||
(nod1->id == this->nodT && nod2->id == this->nodH));
}
public:
int nodH;
int nodT;
};

int _tmain(int argc, _TCHAR* argv[])
{
Node *nd;
for(long int i=0;i<N;i++)
{
for (int j=0;j<N;j++)
{
nd = new Node(j);
}
for (uint j=0;j<N;j++)
{
Edge* e = new Edge(j,N-j);
}
printf("%d %d ",nodes.size(),edges.size());

// Do something here like calling function etc.
nodes.erase(nodes.begin()+N/2);

nodes.clear();
edges.clear();
//nodes.~vector();
//edges.~vector();
printf("%d %d\n",nodes.size(),edges.size());
}
getchar();
return 0;
}

А что я могу сделать? Я попробовал функцию vector :: ~ vector (). Но это не сработало.
Может кто-нибудь помочь мне с тем, как освободить «очищенное» пространство памяти?

0

Решение

Хорошо известный трюк — заменить ваш вектор на временный.

template< class T >
void clearVector( std::vector< T > & v )
{
std::vector< T > dummy;
std::swap( v, dummy );
}

Кстати, использование вектора с необработанными указателями не очень хорошая идея. Я предложу станд :: shared_ptr или похожие. Если (по каким-то удивительным причинам) вы не можете использовать умные указатели, тогда вы должны вызвать функцию следующим образом

struct die {
template <class T> void operator()( const T * p ) const { delete p; }
};
template< class InputIterator >
inline void kill_em_all( const InputIterator & begin, const InputIterator & end )
{
std::for_each( begin, end, die() );
}

...
kill_em_all( vector_to_clear.begin(), vector_to_clear.end() );
0

Другие решения

Причина vector.clear() не удаляет объекты в том, что вы сохраняете необработанные указатели в двух векторах:

vector<Node*> nodes;
vector<Edge*> edges;

Вы должны либо освободить элементы самостоятельно, либо, что лучше, использовать умные указатели (например, std::unique_ptr).

0

Вы назначаете одну гигантскую кучу памяти для вашего приложения. Попробуй уменьшить свой N до 100 для начала. bad_alloc обычно означает, что среда выполнения не смогла зарезервировать память.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector