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