【问题标题】:C++ error : terminate called after throwing an instance of 'std::bad_alloc'C++ 错误:在抛出 'std::bad_alloc' 的实例后调用终止
【发布时间】:2014-05-03 13:08:17
【问题描述】:

我在 Eclipse 上使用下面的代码,我得到一个错误终止“在抛出 'std::bad_alloc' 的实例后调用什么():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 内存。但是我没有授权。我该怎么做?

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

您正在使用在函数执行结束时不会被销毁的堆地址。 告诉我它是否对你有用。

干杯

【讨论】:

  • 如果不再需要,不要忘记delete 每个元素。
  • 如果您使用动态内存分配,您应该使用智能指针(例如 std::unique_ptr)来确保最终删除所有分配的内容。
【解决方案2】:

某事引发std::bad_alloc 类型的异常,表明您的内存不足。这个异常一直传播到main,在那里它“脱落”您的程序并导致您看到错误消息。

由于这里没有人知道“RectInvoice”、“rectInvoiceVector”、“vect”、“im”等是什么,我们无法告诉您究竟是什么导致了内存不足的情况。你甚至没有发布你的真实代码,因为w h 看起来像一个语法错误。

【讨论】:

  • 我的项目有很多文件,cpp 和 .h。所以我放了一小部分。我认为我应该更改 .ini 文件。我说的对吗?
  • 好的.. 感谢您的建议。我是这个平台的新手。我正在学习:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多