468,497 Members | 2,016 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,497 developers. It's quick & easy.

std::bad_alloc



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_holderfund_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';
}
}

Aug 14 '06 #1
5 55280

Gary Wessle wrote:
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_holderfund_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:~$

Aug 14 '06 #2
Gary Wessle wrote:
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).

--
Alan Johnson

Aug 14 '06 #3
"Alan Johnson" <aw***@yahoo.comwrites:
Gary Wessle wrote:
>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).

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';
}
}

Aug 14 '06 #4
Gary Wessle wrote:
"Alan Johnson" <aw***@yahoo.comwrites:

>>Gary Wessle wrote:
>>>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).

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_holderfund_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-lit...s.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/
Aug 15 '06 #5

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

Aug 15 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

24 posts views Thread by Marcus Kwok | last post: by
3 posts views Thread by schizoid_man | last post: by
4 posts views Thread by sndive | last post: by
4 posts views Thread by daroman | last post: by
4 posts views Thread by Alerion | last post: by
4 posts views Thread by Kaio Vieira | last post: by
reply views Thread by NPC403 | last post: by
3 posts views Thread by gieforce | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.