std::bad_alloc

Discussion in 'C++' started by Gary Wessle, Aug 14, 2006.

  1. Gary Wessle

    Gary Wessle Guest

    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';
    }
    }
     
    Gary Wessle, Aug 14, 2006
    #1
    1. Advertising

  2. Gary Wessle

    Guest

    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_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:~$
     
    , Aug 14, 2006
    #2
    1. Advertising

  3. Gary Wessle

    Alan Johnson Guest

    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
     
    Alan Johnson, Aug 14, 2006
    #3
  4. Gary Wessle

    Gary Wessle Guest

    "Alan Johnson" <> writes:

    > 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';
    }
    }
     
    Gary Wessle, Aug 15, 2006
    #4
  5. Gary Wessle wrote:
    > "Alan Johnson" <> writes:
    >
    >
    >>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_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/
     
    Peter Jansson, Aug 15, 2006
    #5
  6. Gary Wessle

    peter koch Guest

    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
     
    peter koch, Aug 15, 2006
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mohsen
    Replies:
    14
    Views:
    14,057
    Nate Barney
    Nov 8, 2006
  2. schizoid_man
    Replies:
    3
    Views:
    5,429
    Schizoid Man
    Nov 12, 2006
  3. Replies:
    4
    Views:
    581
    Roland Pibinger
    Nov 17, 2006
  4. janusthorne
    Replies:
    0
    Views:
    346
    janusthorne
    Aug 7, 2008
  5. Per
    Replies:
    12
    Views:
    3,387
    Juha Nieminen
    Dec 6, 2008
Loading...

Share This Page