错误:内存位置 0x0038fd50 处的 std::bad_alloc

Posted

技术标签:

【中文标题】错误:内存位置 0x0038fd50 处的 std::bad_alloc【英文标题】:Error: std::bad_alloc at memory location 0x0038fd50 【发布时间】:2013-03-22 09:54:25 【问题描述】:

我使用全局堆编写了一个代码。我需要多次重做相同的操作。每次我需要清除堆并重新分配数据。但是 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() 函数。但这没有用。 谁能帮助我如何释放“已清除”的内存空间?

【问题讨论】:

【参考方案1】:

众所周知的技巧是将你的向量与临时创建的向量交换

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

顺便说一句,使用带有原始指针的向量不是一个好主意。我会建议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() );

【讨论】:

我尝试了以下方法:vector temp_nod;矢量 temp_edg;交换(节点,temp_nod);交换(边缘,temp_edg); temp_nod.~vector(); temp_edg.~vector(); 但是还是不行。 无法理解什么不起作用...您要删除向量中的所有元素(由Edge* e = new Edge(j,N-j); 创建)吗? 程序使用的内存还在增加。向量中的元素正在被删除。但是内存空间没有被释放。 :( 如果你完全尝试这段代码 - pastebin.com/sbARHU8P - 你会得到 bad_alloc,但是,如果你取消最后 4 行的注释,它会一直工作到最后【参考方案2】:

vector.clear() 不删除对象的原因是您在两个向量中保留了原始指针:

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

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

【讨论】:

有什么办法吗?你能帮忙吗?【参考方案3】:

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

【讨论】:

我知道。但我需要大量数据。

以上是关于错误:内存位置 0x0038fd50 处的 std::bad_alloc的主要内容,如果未能解决你的问题,请参考以下文章

应用程序发生异常 未知的软件异常(0x0eedfade),位置为0x7c812afb

从文件填充数组时,Visual Studio 中止

C++:未处理的异常:内存位置的 std::out_of_range

0x5919c8ec (msvcr100d.dll) 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xfeeefeee

C++:XY.exe 中 0x0b9ec715 (XX.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004

C#中的堆错误