C ++错误:抛出'std :: bad_alloc'实例后调用terminate

时间:2014-05-03 13:08:18

标签: c++ memory-management runtime-error

我在eclipse上使用下面的代码,我得到一个错误终止“在抛出'std :: bad_alloc'的实例后调用what():std :: bad_alloc”。

我有RectInvoice类和Invoice类。

class Invoice {
public:

    //...... other functions.....
private:
   string name;
   Mat im;
   int width;
   int height;
   vector<RectInvoice*> rectInvoiceVector; 
};

我在Invoice的方法中使用下面的代码。

        // vect : vector<int> *vect;

        RectInvoice rect(vect,im,x, y, w ,h);
        this->rectInvoiceVector.push_back(&rect);

我想在eclipse.ini文件中更改eclipse内存。但我没有授权这个。我怎么能这样做?

2 个答案:

答案 0 :(得分:20)

您的代码中的问题是您无法在全局变量中存储局部变量的内存地址(例如,函数的本地变量):

RectInvoice rect(vect,im,x, y, w ,h);
this->rectInvoiceVector.push_back(&rect);

在那里,&rect是一个临时地址(存储在函数的激活注册表中),当该函数结束时将被销毁。

代码应该创建一个动态变量:

RectInvoice *rect =  new RectInvoice(vect,im,x, y, w ,h);
this->rectInvoiceVector.push_back(rect);

在那里,您使用的堆地址在函数执行结束时不会被销毁。 告诉我它是否适合你。

干杯

答案 1 :(得分:14)

某些东西会抛出std::bad_alloc类型的异常,表示内存不足。这个例外会一直传播到main,在那里#&lt;#34;脱落&#34;您的程序并导致您看到的错误消息。

由于此处没有人知道&#34; RectInvoice&#34;,&#34; rectInvoiceVector&#34;,&#34; vect&#34;,&#34; im&#34;等等,我们不能告诉你究竟是什么导致了内存不足的情况。您甚至没有发布您的真实代码,因为w h看起来像语法错误。