std::bad_alloc

G

Gary Wessle

Hi

I am getting this error when running a very similar code like the
below, it is made for illustration only.

thanks

***************************************
**************** error ****************
(gdb) n
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc

Program received signal SIGABRT, Aborted.
0xb7cd17c7 in raise () from /lib/tls/libc.so.6

(gdb) bt
#0 0xb7cfa7c7 in raise () from /lib/tls/libc.so.6
#1 0xb7cfc06b in abort () from /lib/tls/libc.so.6
#2 0xb7eef644 in __gnu_cxx::__verbose_terminate_handler ()
from /usr/lib/libstdc++.so.6
#3 0xb7eed035 in std::set_unexpected () from /usr/lib/libstdc++.so.6
#4 0xb7eed072 in std::terminate () from /usr/lib/libstdc++.so.6
#5 0xb7eed1aa in __cxa_throw () from /usr/lib/libstdc++.so.6
#6 0xb7eed5eb in operator new () from /usr/lib/libstdc++.so.6
#7 0x0804d28b in __gnu_cxx::new_allocator<fxpair>::allocate (
this=0xbff45c7c, __n=27531841)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/ext/new_allocator.h:88
#8 0x0804d2b0 in std::_Vector_base<fxpair, std::allocator<fxpair> >::_M_allocate (this=0xbff45c7c, __n=27531841)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/stl_vector.h:117
#9 0x0805405a in std::vector<fxpair, std::allocator<fxpair> >::_M_insert_aux (this=0xbff45c7c, __position={_M_current = 0x805d1ac}, __x=@0xbff45b38)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/vector.tcc:275
#10 0x08054428 in std::vector<fxpair, std::allocator<fxpair> >::push_back (
this=0xbff45c7c, __x=@0xbff45b38)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/stl_vector.h:610
#11 0x08052cbd in main () at main.cpp:85

***************************************
**************** code *****************
#include <string>
#include <vector>
#include <iostream>
using namespace std;

class acc_holder
{
string name;
double a, b, c, d, e, f, g;
double max_weekly_withdraw;
double daily_withdraw;
int h;

public:
acc_holder(string nam, double d_withdraw)
: name(nam), daily_withdraw(d_withdraw),
a(0),
b(0),
c(0),
d(0),
e(0),
f(0),
g(0)
{}


void update_weekly_figurs()
{
max_weekly_withdraw += daily_withdraw;
cout << name << ": " << max_weekly_withdraw << '\t';
}
};

int main(){

acc_holder jack("jack", 1.1);
acc_holder mary("mary", 1.2);
acc_holder sam("sam", 1.3);
acc_holder job("job", 1.4);
vector<acc_holder> fund_participanets;
fund_participanets.push_back(jack);
fund_participanets.push_back(mary);
fund_participanets.push_back(sam);
fund_participanets.push_back(job);

for( unsigned i = 0; i<=3; i++){
for(unsigned j = 0; j<=fund_participanets.size()-1; j++){
fund_participanets[j].update_weekly_figurs();
}
cout << '\n';
}
}
 
W

wittempj

Gary said:
Hi

I am getting this error when running a very similar code like the
below, it is made for illustration only.

thanks

***************************************
**************** error ****************
(gdb) n
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc

Program received signal SIGABRT, Aborted.
0xb7cd17c7 in raise () from /lib/tls/libc.so.6

(gdb) bt
#0 0xb7cfa7c7 in raise () from /lib/tls/libc.so.6
#1 0xb7cfc06b in abort () from /lib/tls/libc.so.6
#2 0xb7eef644 in __gnu_cxx::__verbose_terminate_handler ()
from /usr/lib/libstdc++.so.6
#3 0xb7eed035 in std::set_unexpected () from /usr/lib/libstdc++.so.6
#4 0xb7eed072 in std::terminate () from /usr/lib/libstdc++.so.6
#5 0xb7eed1aa in __cxa_throw () from /usr/lib/libstdc++.so.6
#6 0xb7eed5eb in operator new () from /usr/lib/libstdc++.so.6
#7 0x0804d28b in __gnu_cxx::new_allocator<fxpair>::allocate (
this=0xbff45c7c, __n=27531841)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/ext/new_allocator.h:88
#8 0x0804d2b0 in std::_Vector_base<fxpair, std::allocator<fxpair> >::_M_allocate (this=0xbff45c7c, __n=27531841)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/stl_vector.h:117
#9 0x0805405a in std::vector<fxpair, std::allocator<fxpair> >::_M_insert_aux (this=0xbff45c7c, __position={_M_current = 0x805d1ac}, __x=@0xbff45b38)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/vector.tcc:275
#10 0x08054428 in std::vector<fxpair, std::allocator<fxpair> >::push_back (
this=0xbff45c7c, __x=@0xbff45b38)
at /usr/lib/gcc/i486-linux-gnu/4.0.4/../../../../include/c++/4.0.4/bits/stl_vector.h:610
#11 0x08052cbd in main () at main.cpp:85

***************************************
**************** code *****************
#include <string>
#include <vector>
#include <iostream>
using namespace std;

class acc_holder
{
string name;
double a, b, c, d, e, f, g;
double max_weekly_withdraw;
double daily_withdraw;
int h;

public:
acc_holder(string nam, double d_withdraw)
: name(nam), daily_withdraw(d_withdraw),
a(0),
b(0),
c(0),
d(0),
e(0),
f(0),
g(0)
{}


void update_weekly_figurs()
{
max_weekly_withdraw += daily_withdraw;
cout << name << ": " << max_weekly_withdraw << '\t';
}
};

int main(){

acc_holder jack("jack", 1.1);
acc_holder mary("mary", 1.2);
acc_holder sam("sam", 1.3);
acc_holder job("job", 1.4);
vector<acc_holder> fund_participanets;
fund_participanets.push_back(jack);
fund_participanets.push_back(mary);
fund_participanets.push_back(sam);
fund_participanets.push_back(job);

for( unsigned i = 0; i<=3; i++){
for(unsigned j = 0; j<=fund_participanets.size()-1; j++){
fund_participanets[j].update_weekly_figurs();
}
cout << '\n';
}
}

The only issue I see is that you don't initialize
max_weekly_withdraw,when I compile & run output looks fine:

martin@jordaan:~$ ./hello
jack: 1.1 mary: 1.2 sam: 1.3 job: 1.4
jack: 2.2 mary: 2.4 sam: 2.6 job: 2.8
jack: 3.3 mary: 3.6 sam: 3.9 job: 4.2
jack: 4.4 mary: 4.8 sam: 5.2 job: 5.6
martin@jordaan:~$
 
A

Alan Johnson

Gary said:
Hi

I am getting this error when running a very similar code like the
below, it is made for illustration only.

thanks

***************************************
**************** error ****************
(gdb) n
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc

std::bad_alloc is an exception that gets thrown by 'new' when it can't
allocate the memory you requested. Something (very likely the standard
library containers you are using) is requesting memory, and that memory
can't be allocated.

You should either change your memory usage patterns so that enough
memory is available to satisfy all the requests, or catch bad_alloc and
handle it in some appropriate way (or preferably, both).
 
G

Gary Wessle

Alan Johnson said:
std::bad_alloc is an exception that gets thrown by 'new' when it can't
allocate the memory you requested. Something (very likely the standard
library containers you are using) is requesting memory, and that memory
can't be allocated.

You should either change your memory usage patterns so that enough
memory is available to satisfy all the requests, or catch bad_alloc and
handle it in some appropriate way (or preferably, both).


to change the memory usage pattern I did the following which fixed the
problem.
push_back the addresses of the objects into the vector instead of the
objects themselves,





thank you

#include <string>
#include <vector>
#include <iostream>
using namespace std;




class acc_holder
{
string name;
double a, b, c, d, e, f, g;
double max_weekly_withdraw;
double daily_withdraw;
int h;

public:
acc_holder(string nam, double d_withdraw)
: name(nam), daily_withdraw(d_withdraw),
a(0),
b(0),
c(0),
d(0),
e(0),
f(0),
g(0)
{}


void update_weekly_figurs()
{
max_weekly_withdraw += daily_withdraw;
cout << name << ": " << max_weekly_withdraw << '\t';
}
};

int main(){


acc_holder jack("jack", 1.1);
acc_holder mary("mary", 1.2);
acc_holder sam("sam", 1.3);
acc_holder job("job", 1.4);
vector<acc_holder*> fund_participanets;
fund_participanets.push_back(&jack);
fund_participanets.push_back(&mary);
fund_participanets.push_back(&sam);
fund_participanets.push_back(&job);

// no acc_holder is permited to do 2 or more consecutive transactions
// therefor they must alternate, each is permited 5 transactions.

for( unsigned i = 0; i<=3; i++){
for(unsigned j = 0; j<=fund_participanets.size()-1; j++){
fund_participanets[j]->update_weekly_figurs();
}
cout << '\n';
}
}
 
P

Peter Jansson

Gary said:
std::bad_alloc is an exception that gets thrown by 'new' when it can't
allocate the memory you requested. Something (very likely the standard
library containers you are using) is requesting memory, and that memory
can't be allocated.

You should either change your memory usage patterns so that enough
memory is available to satisfy all the requests, or catch bad_alloc and
handle it in some appropriate way (or preferably, both).



to change the memory usage pattern I did the following which fixed the
problem.
push_back the addresses of the objects into the vector instead of the
objects themselves,





thank you

#include <string>
#include <vector>
#include <iostream>
using namespace std;




class acc_holder
{
string name;
double a, b, c, d, e, f, g;
double max_weekly_withdraw;
double daily_withdraw;
int h;

public:
acc_holder(string nam, double d_withdraw)
: name(nam), daily_withdraw(d_withdraw),
a(0),
b(0),
c(0),
d(0),
e(0),
f(0),
g(0)
{}


void update_weekly_figurs()
{
max_weekly_withdraw += daily_withdraw;
cout << name << ": " << max_weekly_withdraw << '\t';
}
};

int main(){


acc_holder jack("jack", 1.1);
acc_holder mary("mary", 1.2);
acc_holder sam("sam", 1.3);
acc_holder job("job", 1.4);
vector<acc_holder*> fund_participanets;
fund_participanets.push_back(&jack);
fund_participanets.push_back(&mary);
fund_participanets.push_back(&sam);
fund_participanets.push_back(&job);

// no acc_holder is permited to do 2 or more consecutive transactions
// therefor they must alternate, each is permited 5 transactions.

for( unsigned i = 0; i<=3; i++){
for(unsigned j = 0; j<=fund_participanets.size()-1; j++){
fund_participanets[j]->update_weekly_figurs();
}
cout << '\n';
}
}

Hi,

Instead, *if* you had a default constructor in acc_holder, you could
have written:

vector<acc_holder> fund_participanets;
fund_participanets.push_back(jack);
fund_participanets.push_back(mary);
fund_participanets.push_back(sam);
fund_participanets.push_back(job);

And change -> into . in the loop.

The point is in FAQ 8.6:
(http://www.parashift.com/c++-faq-lite/references.html#faq-8.6)
"Use references when you can, and pointers when you have to."


Sincerely,

Peter Jansson
http://www.p-jansson.com/
http://www.jansson.net/
 
P

peter koch

Gary Wessle skrev:
Hi

I am getting this error when running a very similar code like the
below, it is made for illustration only.

thanks

***************************************
**************** error ****************
(gdb) n
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc

Program received signal SIGABRT, Aborted.
0xb7cd17c7 in raise () from /lib/tls/libc.so.6

[snipped stack trace and demo program]

That program looks okay and will NOT throw std::bad_alloc. First rule
is to post a program that contains the behaviour you want to
demonstrate. Since you did not do that, it is impossible to help you.
Most probably you are overwriting memory somewhere in your program. The
"solution" you show in anither post on this thread is not really a
solution, but a rearrangement of code that makes the problem disappear
- for a while!

Kind regards
Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,954
Messages
2,570,116
Members
46,704
Latest member
BernadineF

Latest Threads

Top