'invalid next size' podczas destrukcji stringstream (chyba)

0

Witam!
Napisałem sobie prostą funkcję konwertującą:

string roundStr (float liczba, int ile_miejsc)
{
  string liczbaStr, zera(ile_miejsc, '0');

  liczba = liczba * pow(10, ile_miejsc);

  liczba = int (liczba + 0.5);

  stringstream liczbaStrS;

  liczbaStrS << liczba;
  liczbaStr = liczbaStrS.str();

  if(int(liczba) % 10 == 0)
	  liczbaStr.append(zera);

  liczbaStrS.clear();                    //1
  liczbaStrS.str(std::string());    //2

  return liczbaStr;
}

Kompiluje się, ale kompilator wyrzuca mi:
*** glibc detected *** /media/disk/c++/projects/akcje2/Debug/akcje2: free(): invalid next size (fast): 0x080d42d0 ***
czyli jakiś wyciek pamięci (?)
Wygooglowałem, że powinno się czyścić stringstream. Stąd też linie 1 i 2. Kombinowałem z tworzeniem strumienia za pomocą new i wywoływaniem jego destruktora.. na razie bezskutecznie :(
Proszę o jakąś pomoc..
Pozdr!

0

Po co czyścić stringstream który i tak zniknie po wyjściu z tej funkcji? Gdzieś tak wyczytał?

0

po co te linijki oznaczone * 1 i * 2? Zbędne, niepotrzebne, po prostu WTF.

Poza tym masz dość długa listę bugów jak na tak krótki kod, np dla liczb ujemnych.

Napisz sobie kod testujący tą funkcję:

....
struct TestCase {
    float liczba;
    int ile_miejsc;
    string oczekiwany_wynik;
};

void main()
{
    TestCase  testCases[] = {
            { 0, 0, "0"},
            { 1, 0, "1"},
            { 0.00043, 1, "0"},
            { 123.43, 1, "123.4"},
            { 127.56, 1, "127.7"},
            { -123.43, 1, "-123.4"},
            { -127.56, 1, "-127.7"},
            { 234234.24255, 4, "234234.2426"},
            { 123.43, -1, "120"},
            { 127.56, -1, "130"},
            { -123.43, -1, "-120"},
            { -127.56, -1, "-130"},
            { 234234, -4, "230000"}
            // powymyślaj jeszcze coś
    }
    const int testCount = sizeof(testCases)/sizeof(testCases[0]);
    
    for(int i=0; i<testCount ; ++i) {
          string wynik;
          wynik = roundStr(testCases[i].liczba, testCases[i].ile_miejsc);
          if (wynik != testCases[i].oczekiwany_wynik) {
                 cerr << "Test zawiódł dla danych: " << testCases[i].liczba << " ,   " << testCases[i].ile_miejsc << endl;
                 cerr << "otrzymany wynik: " << wynik << endl;
                 cerr << "oczekiwany wynik: " << testCases[i].oczekiwany_wynik << endl;
          }
    }
}

</cpp>
0

Ta funkcja nawet nie konwertuje tak jak powinna. I mniejsza z tym.
Chciałbym się dowiedzieć dlaczego dostaję komunikat:

*** glibc detected *** /media/disk/c++/projects/akcje2/Debug/akcje2: free(): invalid next size (fast): 0x093ff318 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7523ff1]
/lib/tls/i686/cmov/libc.so.6[0xb75256f2]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb75287cd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb76fb6f1]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xb76d935d]
/usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x4c)[0xb76dad6c]
/media/disk/c++/projects/akcje2/Debug/akcje2[0x804a197]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb74cfb56]
/media/disk/c++/projects/akcje2/Debug/akcje2[0x80493b1]
======= Memory map: ========
08048000-0804c000 r-xp 00000000 08:21 1505       /media/disk/c++/projects/akcje2/Debug/akcje2
0804c000-0804d000 r--p 00003000 08:21 1505       /media/disk/c++/projects/akcje2/Debug/akcje2
0804d000-0804e000 rw-p 00004000 08:21 1505       /media/disk/c++/projects/akcje2/Debug/akcje2
093ff000-09420000 rw-p 00000000 00:00 0          [heap]
b7300000-b7321000 rw-p 00000000 00:00 0 
b7321000-b7400000 ---p 00000000 00:00 0 
b74b8000-b74b9000 rw-p 00000000 00:00 0 
b74b9000-b75f7000 r-xp 00000000 07:00 1174       /lib/tls/i686/cmov/libc-2.10.1.so
b75f7000-b75f8000 ---p 0013e000 07:00 1174       /lib/tls/i686/cmov/libc-2.10.1.so
b75f8000-b75fa000 r--p 0013e000 07:00 1174       /lib/tls/i686/cmov/libc-2.10.1.so
b75fa000-b75fb000 rw-p 00140000 07:00 1174       /lib/tls/i686/cmov/libc-2.10.1.so
b75fb000-b75fe000 rw-p 00000000 00:00 0 
b75fe000-b761a000 r-xp 00000000 07:00 3173       /lib/libgcc_s.so.1
b761a000-b761b000 r--p 0001b000 07:00 3173       /lib/libgcc_s.so.1
b761b000-b761c000 rw-p 0001c000 07:00 3173       /lib/libgcc_s.so.1
b761c000-b761d000 rw-p 00000000 00:00 0 
b761d000-b7641000 r-xp 00000000 07:00 3407       /lib/tls/i686/cmov/libm-2.10.1.so
b7641000-b7642000 r--p 00023000 07:00 3407       /lib/tls/i686/cmov/libm-2.10.1.so
b7642000-b7643000 rw-p 00024000 07:00 3407       /lib/tls/i686/cmov/libm-2.10.1.so
b7643000-b7729000 r-xp 00000000 07:00 3712       /usr/lib/libstdc++.so.6.0.13
b7729000-b772d000 r--p 000e6000 07:00 3712       /usr/lib/libstdc++.so.6.0.13
b772d000-b772e000 rw-p 000ea000 07:00 3712       /usr/lib/libstdc++.so.6.0.13
b772e000-b7735000 rw-p 00000000 00:00 0 
b7749000-b774c000 rw-p 00000000 00:00 0 
b774c000-b774d000 r-xp 00000000 00:00 0          [vdso]
b774d000-b7768000 r-xp 00000000 07:00 6988       /lib/ld-2.10.1.so
b7768000-b7769000 r--p 0001a000 07:00 6988       /lib/ld-2.10.1.so
b7769000-b776a000 rw-p 0001b000 07:00 6988       /lib/ld-2.10.1.so
bfa32000-bfa47000 rw-p 00000000 00:00 0          [stack]

i nie ma to raczej związku z taką podstawową optymalizacją jak obsługa "nieodpowiednich" argumentów funkcji :-/

0

Najwyraźniej masz błąd zupełnie w innym miejscu (to że crash masz w tej funkcji w cale nie oznacza, że to ona jest winna problemów). Używasz jakiegoś kontenera?

0
MarekR22 napisał(a)

Używasz jakiegoś kontenera?

Właśnie nie :-/ Jedynie stringstream i wydaje mi się, że to z tym typem jest jakiś problem w zwalnianiu/dostępie do pamięci..
Kiedy debuguję, program sypie się w czasie wychodzenia z funkcji czyli po przejściu linii z nawiasem " } "

0

czy po wywaleniu linijek

liczbaStrS.clear(); //1
liczbaStrS.str(std::string()); //2

błąd nadal występuje? jestem w stanie wobie wyobrazic licha implementacje lub czystego pecha, ze stringstream zwraca Ci podczas str() wewnetrzny bufor ktory potem sie zmienia, ale przeciez string implementuje copy-on-write.. dziwactwo.. inne pytanie - probowales na innej maszynie albo innym kompilatorze? gdy wystepowal ten blad, z jakimi argumentami odpalales te funkcje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1