2013-03-22 126 views
0

我写了一个使用全局堆的代码。我需要多次重做相同的操作。每次我需要清除堆并重新分配数据。但vector :: clear()函数不释放内存。所以一段时间后内存被填满并且程序终止。错误:std :: bad_alloc在内存位置0x0038fd50

#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); 
} 

掉你的载体BTW,使用矢量与原始指针是不是一个好主意。我会建议std::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

我试过以下内容: \t \t \t ** vector temp_nod; \t \t \t vector temp_edg; \t \t \t swap(nodes,temp_nod); \t \t \t swap(edges,temp_edg); \t \t \t temp_nod。〜vector(); \t \t \t temp_edg。〜vector(); ** 但它仍然无法正常工作。 – 2013-03-22 10:10:33

+0

无法理解哪些不起作用...是否要删除矢量(由Edge * e = new Edge(j,N-j);')创建的所有元素? – borisbn 2013-03-22 10:13:15

+0

程序使用的内存仍在增加。 向量中的元素正在被删除。但内存空间并未被释放。 :( – 2013-03-22 10:20:11

0

原因vector.clear()不会删除的对象是你保持原始指针在两个载体:

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

你要么必须自己解除分配的元素,或者更好,使用智能指针(例如,std::unique_ptr )。

+0

有什么出路吗?你能帮我吗? – 2013-03-22 09:58:08

0

您正在为应用程序分配一个巨大的内存堆。尝试减少你的N为100开始。 bad_alloc通常表示运行时无法保留内存。

+0

我知道。但是我需要大量的数据。 – 2013-03-22 10:03:40

相关问题