Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ error : terminate called after throwing an instance of 'std::bad_alloc'

I use below code on eclipse and I get an error terminate "called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc".

I have RectInvoice class and Invoice class.

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

And I use below code on a Invoice's method.

        // vect : vector<int> *vect;          RectInvoice rect(vect,im,x, y, w ,h);         this->rectInvoiceVector.push_back(&rect); 

And I want to change eclipse memory in eclipse.ini file. But I dont authorized for this.How can I do this?

like image 528
andressophia Avatar asked May 03 '14 13:05

andressophia


People also ask

What causes std:: bad_ alloc?

std::bad_alloc is a type of exception that occurs when the new operator fails to allocate the requested space. This type of exception is thrown by the standard definitions of ​operator new (declaring a variable) and operator new[] (declaring an array) when they fail to allocate the requested storage space.

How do I fix bad Alloc?

The only thing you could do when catching std::bad_alloc is to perhaps log the error, and try to ensure a safe program termination by freeing outstanding resources (but this is done automatically in the normal course of stack unwinding after the error gets thrown if the program uses RAII appropriately).


2 Answers

The problem in your code is that you can't store the memory address of a local variable (local to a function, for example) in a globlar variable:

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

There, &rect is a temporary address (stored in the function's activation registry) and will be destroyed when that function end.

The code should create a dynamic variable:

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

There you are using a heap address that will not be destroyed in the end of the function's execution. Tell me if it worked for you.

Cheers

like image 122
Agus Arias Avatar answered Oct 03 '22 22:10

Agus Arias


Something throws an exception of type std::bad_alloc, indicating that you ran out of memory. This exception is propagated through until main, where it "falls off" your program and causes the error message you see.

Since nobody here knows what "RectInvoice", "rectInvoiceVector", "vect", "im" and so on are, we cannot tell you what exactly causes the out-of-memory condition. You didn't even post your real code, because w h looks like a syntax error.

like image 41
Christian Hackl Avatar answered Oct 03 '22 20:10

Christian Hackl