Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    c++] std::bad_alloc

    Ciao a tutti.
    In fase di compilazione tutto ok. Quando faccio dei run a volte va bene, a valte va male.
    Qunado va male ottengo il seguente errore:

    terminate called after throwing an instance of 'std::bad_alloc'
    what(): St9bad_alloc
    Aborted

    Sto scrivendo un programmino che deve calcolare dei cammini minimi su un grafo.
    piu' precisamente deve calcolare cammini minimi per ogni ossibile coppia sorgente-destinazione,
    dove i pesi cambiano per ogni coppia.
    Il grafo e' completo, per cui, se ho 50 nodi, ho 50*49 archi. Le possibili coppie
    sorgente destinazione sono 50*49 anch'esse.
    In pratica ho un vettore dei costi che contiene (50*49*50*40)= 6 milioni e rotti di valori.

    Qunado le dimensioni del grafo sono sotto i 53, allora no ho problemi. Sopra ricevo l'errore.

    Forse il problema e' l'allocazione del vettore. la parte di codice e':

    int Shortest_Paths::initCosts(Row costs)
    {
    ____int count = 1;
    ____// per essere sicuri che va tutto bene con la lunghezza del vettore
    ____vectCosts.resize(nnarcs*nnarcs);
    ____for (int h=0; h < nnodes; h++)
    ____{
    ________for (int k=0; k < nnodes; k++)
    ________{
    ____________if ( h!= k)
    ____________{
    ________________for (int i = 0; i < nnarcs; i++)
    ________________{___
    ____________________// cout << h << " " << k << " " << i << "-->" << *(costs + offset(h,k,nnodes)+i) << " " << count++ << endl;
    ____________________//cout << vectCosts.max_size() << endl;
    ____________________vectCosts.push_back(*(costs + offset(h,k,nnodes)+i));
    ________________}
    ____________}
    ________}
    ____}
    }


    Non so, non mi sembra ci sia niente di sbagliato.
    Altretutto la dimensione massima e' di gran lunga maggiore di 7 milioni richiesti dall'istanza con 53 nodi.
    E' meglio che faccio una matrice?

    ah, se puo' essere d'aiuto, questo e' lo stack nel momento in cui il programma si ferma:
    (gdb) bt
    #0 0xb7c6b847 in raise () from /lib/tls/libc.so.6
    #1 0xb7c6d0d9 in abort () from /lib/tls/libc.so.6
    #2 0xb7e41c6b in __gnu_cxx::__verbose_terminate_handler () from /usr/lib/libstdc++.so.6
    #3 0xb7e3f8a4 in __cxa_call_unexpected () from /usr/lib/libstdc++.so.6
    #4 0xb7e3f8e1 in std::terminate () from /usr/lib/libstdc++.so.6
    #5 0xb7e3fa64 in __cxa_throw () from /usr/lib/libstdc++.so.6
    #6 0xb7e3fcb8 in operator new () from /usr/lib/libstdc++.so.6
    #7 0x080502a3 in __gnu_cxx::new_allocator<double>::allocate ()
    #8 0x0804ef22 in std::_Vector_base<double, std::allocator<double> >::_M_allocate ()
    #9 0x0804d360 in std::vector<double, std::allocator<double> >::_M_insert_aux ()
    #10 0x0804ba5f in std::vector<double, std::allocator<double> >:ush_back ()
    #11 0x0804a330 in Shortest_Paths::initCosts ()
    #12 0x0804a07e in Shortest_Paths::Shortest_Paths ()
    #13 0x08049a8f in main () at main.C:32
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... penso proprio che si superi lo spazio allocabile ...

  3. #3
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    ma e' un problema dipendente dal computer?
    se si', dovrebbe funzionare su un computer con piu' memoria?
    boh!
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  4. #4
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    ebbene, si'.
    E' propio che non c'ha piu' memoria disponibile.
    Mi sono accorto cosi' che nella reinstallazione del s.o. avevo disattivato la swap.
    Posso andare piu' su' con la dimensione, ora, ma comunque istanze di 150-200 nodi sono lontane miglia.
    Non pensavo fosse cosi' grosso il problema della memoria.
    Adesso che ci penso, forse posso di evitare la copia di alcuni vettori. Vediamo.

    C'e' qualcosa di piu' efficiente di un vettore per conservare i dati? puo' essere la lunghezza a dare problemi?
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.