2012-05-01 2 views
1

У меня проблемы со струнными потоками; когда я пытаюсь использовать in-operator (< <) на непустой строке, я получаю карту памяти, напечатанную при запуске моей программы. Вот код:Строковый поток, создающий карту памяти

for(int i=1 ; i<djikstra_result[0] ; i++) 
{ 
    cout << "DEBUG 5:10 - Round " << i << endl; 
    if(i==djikstra_result[0]-1) 
    { 
     ss << djikstra_result[i] << "km."; 
     cout << "DEBUG 5:11" << endl; 
    } 
    else 
    { 
     int j = djikstra_result[i]; 
     cout << "DEBUG 5:13 - j=" << j << endl; 
     ss << this->airport[j] << " - "; 
     cout << "DEBUG 5:14" << endl; 
    } 
} 

сс мой stringstream, djikstra_result [] представляет собой динамический целочисленный массив, это-аэропорт [] представляет собой динамический массив строк.

код компилируется нормально, но это работает только до тех пор, "соиЬ < < "DEBUG 5:13 - J =" < < < < J ENDL;". В результате с этого момента и далее является:

 
DEBUG 5:13 - j=0 
*** glibc detected *** ./graph: malloc(): memory corruption: 0x0000000000ec10f0 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x77806)[0x7f9f8403a806] 
/lib/libc.so.6(+0x7b928)[0x7f9f8403e928] 
/lib/libc.so.6(__libc_malloc+0x6e)[0x7f9f8403f7de] 
/usr/lib/libstdc++.so.6(_Znwm+0x1d)[0x7f9f848ab24d] 
/usr/lib/libstdc++.so.6(_ZNSs4_Rep9_S_createEmmRKSaIcE+0x59)[0x7f9f84887d79] 
/usr/lib/libstdc++.so.6(_ZNSs4_Rep8_M_cloneERKSaIcEm+0x2b)[0x7f9f8488874b] 
/usr/lib/libstdc++.so.6(_ZNSs7reserveEm+0x3c)[0x7f9f8488927c] 
/usr/lib/libstdc++.so.6(_ZNSs6appendERKSs+0x4f)[0x7f9f848896ff] 
./graph[0x402138] 
./graph[0x4032ce] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f9f83fe1c4d] 
./graph[0x401439] 
======= Memory map: ======== 
00400000-00404000 r-xp 00000000 00:15 15341576       /home/psyberion/Dropbox/algorithms/assign-3b/graph 
00604000-00605000 r--p 00004000 00:15 15341576       /home/psyberion/Dropbox/algorithms/assign-3b/graph 
00605000-00606000 rw-p 00005000 00:15 15341576       /home/psyberion/Dropbox/algorithms/assign-3b/graph 
00ec1000-00ee2000 rw-p 00000000 00:00 0         [heap] 
7f9f7c000000-7f9f7c021000 rw-p 00000000 00:00 0 
7f9f7c021000-7f9f80000000 ---p 00000000 00:00 0 
7f9f83fc3000-7f9f8413d000 r-xp 00000000 08:05 2887651     /lib/libc-2.11.1.so 
7f9f8413d000-7f9f8433c000 ---p 0017a000 08:05 2887651     /lib/libc-2.11.1.so 
7f9f8433c000-7f9f84340000 r--p 00179000 08:05 2887651     /lib/libc-2.11.1.so 
7f9f84340000-7f9f84341000 rw-p 0017d000 08:05 2887651     /lib/libc-2.11.1.so 
7f9f84341000-7f9f84346000 rw-p 00000000 00:00 0 
7f9f84346000-7f9f8435c000 r-xp 00000000 08:05 2884391     /lib/libgcc_s.so.1 
7f9f8435c000-7f9f8455b000 ---p 00016000 08:05 2884391     /lib/libgcc_s.so.1 
7f9f8455b000-7f9f8455c000 r--p 00015000 08:05 2884391     /lib/libgcc_s.so.1 
7f9f8455c000-7f9f8455d000 rw-p 00016000 08:05 2884391     /lib/libgcc_s.so.1 
7f9f8455d000-7f9f845df000 r-xp 00000000 08:05 2887634     /lib/libm-2.11.1.so 
7f9f845df000-7f9f847de000 ---p 00082000 08:05 2887634     /lib/libm-2.11.1.so 
7f9f847de000-7f9f847df000 r--p 00081000 08:05 2887634     /lib/libm-2.11.1.so 
7f9f847df000-7f9f847e0000 rw-p 00082000 08:05 2887634     /lib/libm-2.11.1.so 
7f9f847e0000-7f9f848d6000 r-xp 00000000 08:05 25175504     /usr/lib/libstdc++.so.6.0.13 
7f9f848d6000-7f9f84ad6000 ---p 000f6000 08:05 25175504     /usr/lib/libstdc++.so.6.0.13 
7f9f84ad6000-7f9f84add000 r--p 000f6000 08:05 25175504     /usr/lib/libstdc++.so.6.0.13 
7f9f84add000-7f9f84adf000 rw-p 000fd000 08:05 25175504     /usr/lib/libstdc++.so.6.0.13 
7f9f84adf000-7f9f84af4000 rw-p 00000000 00:00 0 
7f9f84af4000-7f9f84b14000 r-xp 00000000 08:05 2887636     /lib/ld-2.11.1.so 
7f9f84ceb000-7f9f84cef000 rw-p 00000000 00:00 0 
7f9f84d10000-7f9f84d13000 rw-p 00000000 00:00 0 
7f9f84d13000-7f9f84d14000 r--p 0001f000 08:05 2887636     /lib/ld-2.11.1.so 
7f9f84d14000-7f9f84d15000 rw-p 00020000 08:05 2887636     /lib/ld-2.11.1.so 
7f9f84d15000-7f9f84d16000 rw-p 00000000 00:00 0 
7fff9500a000-7fff9501f000 rw-p 00000000 00:00 0       [stack] 
7fff951ff000-7fff95200000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted 

Я сталкивался с этой проблемой раньше, но я не в состоянии выяснить, что это вызвано, кроме какой-то проблемы памяти. Может ли кто-нибудь помочь? Вот код для всей функции:

string graph::get_shortest(string name1, string name2) 
{ 
int* djikstra_result; 
int result[this->nr_airport]; 
int source=-1; 
int goal=-1; 
bool source_found = false; 
bool goal_found = false; 
string final=""; 
string space=" - "; 
stringstream ss; 
cout << "DEBUG 5:1" << endl; 
for(int i=0 ; i<this->nr_airport ; i++) 
{ 
    cout << "DEBUG 5:2 - Round " << i << endl; 
    if(name1==this->airport[i]) 
    { 
     cout << "DEBUG 5:3" << endl; 
     source = i; 
     source_found = true; 
    } 
    else if(name2==this->airport[i]) 
    { 
     cout << "DEBUG 5:4" << endl; 
     goal = i; 
     goal_found = true; 
    } 
} 
cout << "DEBUG 5:5" << endl; 
if(!source_found || !goal_found) 
{ 
    throw "Starting point or destination not found"; 
} 
cout << "DEBUG 5:6" << endl; 
for(int i=0 ; i<this->nr_airport ; i++) 
{ 
    result[i] = -1; 
    cout << "DEBUG 5:7 - Round " << i << endl; 
} 
cout << "DEBUG 5:8" << endl; 
djikstra_result = djikstra(source, goal); 
cout << "DEBUG 5:9" << endl; 
for(int i=1 ; i<djikstra_result[0] ; i++) 
{ 
    cout << "DEBUG 5:10 - Round " << i << endl; 
    if(i==djikstra_result[0]-1) 
    { 
     ss << djikstra_result[i] << "km"; 
     cout << "DEBUG 5:11" << endl; 
    } 
    else 
    { 
     int j = djikstra_result[i]; 
     cout << "DEBUG 5:13 - j=" << j << endl; 
     //string val = this->airport[j]; 
     cout << "DEBUG 5:14" << endl; 
     ss << this->airport[j]; 
     cout << "DEBUG 5:15" << endl; 
    } 
} 
ss >> final; 
return final; 
} 

EDIT:

массив this-> аэропорт [] объявлен как это:

this->cap_airport = 1; 
this->airport = new string[this->cap_airport]; 

Когда я что-то добавить к массиву I разверните его с помощью следующей функции:

void graph::expand_list() 
{ 
if(this->nr_airport==this->cap_airport) 
{ 
    this->cap_airport++; 
    string* temp = new string[this->cap_airport]; 
    for(int i=0 ; i<this->nr_airport ; i++) 
    { 
     temp[i] = ""; 
     if(this->airport[i]!="") 
     { 
      temp[i] = this->airport[i]; 
     } 
    } 
    delete [] this->airport; 
    this->airport = temp; 
} 
} 

Я делаю это, чтобы избежать распределения g больше места, чем необходимо, и я только добавляю информацию в массив при чтении из файла.

EDIT:

После удаления < < "-"; из строки, кажется, прогресс. Я вызываю функцию get_shortest (строка name1, строка Имя2) в моей основной-функции, например:

graph g1; 
cout << g1.get_shortest("A","E") << endl; 

теперь я могу видеть еще несколько выход, когда я запускаю программу:

 
DEBUG 5:15 
DEBUG 5:10 - Round 5 
DEBUG 5:11 
AAAA0km 
*** glibc detected *** ./graph: free(): invalid pointer: 0x0000000001ba7070 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x77806)[0x7f400d9cf806] 
/lib/libc.so.6(cfree+0x73)[0x7f400d9d60d3] 
//And so on as before 

Таким образом, проблема, похоже, не связана с потоком струн. Есть идеи?

+1

'j' может выходить за пределы массива:' this-> airport [j] '? – hmjd

+0

Несвязанный с вашей проблемой, но все же хорошая практика: передайте переменные по ссылке const. http://stackoverflow.com/questions/2582797/why-pass-by-const-reference-instead-of-by-value – luke

+0

@hmjd, я не думаю, что это так, так как 'j' равно 0 когда программа выйдет из строя. Я добавлю это в вопрос, хотя, спасибо за указание! – Psyberion

ответ

0

Я нашел проблему во всей другой части программы; карта памяти является результатом недопустимой операции с памятью, но она не читается ни из djikstra_result [], ни из этого -> аэропорта [], как это было предложено. Просто попытка чтения из недопустимой позиции в массиве приведет к ошибке сегментации. Проблема в том, что я в функции djikstra (int source, goal) пытался добавить данные в недопустимую позицию в массиве. Вот код:

result = new int[nr_visited]; 
for(int i=0 ; i<nr_visited+2 ; i++) 
{ 
    if(i==0) 
    { 
     result[i] = nr_visited; 
    } 
    else if(i==nr_visited+1) 
    { 
     result[i] = distance; 
    } 
    else 
    { 
     result[i] = route[i-1]; 
    } 
} 
return result; 

создать динамический целочисленный массив с длиной nr_visited, но я стараюсь поместить данные в положении nr_visited + 1, который является недействительным. Это вызывает карту памяти.Таким образом, исправление объявить целочисленный массив с длиной nr_visited + 2:

result = new int[nr_visited+2]; 

Итак, теперь, все это работает.

Смежные вопросы