logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Visual Studio 2005 - Program działa po kompilacji w GCC, sypie się po VS2005

the_fifth_horseman 30 Wrz 2013 09:43 1176 1
REKLAMA
  • #1 12793237
    the_fifth_horseman
    Poziom 32  
    Posty: 2088
    Pomógł: 76
    Ocena: 16
    Witam,
    Mam opracowany losowy generator nazw.
    Po skompilowaniu testowej aplikacji z wykorzystaniem GCC (zainstalowanym razem z Code::Blocks), program działa stabilnie - a przynajmniej na to wygląda.

    Po skompilowaniu tej samej aplikacji z wykorzystaniem kompilatora stanowiącego część Visual Studio 2005 (nie jestem w stanie ustalić nazwy tego "wynalazku"), pierwsze dwie nazwy generowane są poprawnie po czym aplikacja sypie się z powodu błędów pamięci.

    Problem udało mi się sprowadzić do dwóch linii kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problem w tym że nie mam pojęcia dlaczego jest taka różnica w zachowaniu programu.
    manifest.dataStart wskazuje - a przynajmniej powinien - na początek bloku pamięci zawierającego załadowany plik tekstowy. Nie jest wykorzystywany poza dictionary_init().
    appendPointer przy zwalnianiu w namegen_cleanup() ustawiony został na początek 256-elementowej tablicy znaków która była wykorzystywana jako bufor do którego generator wpisywał wyniki.
    Według mojej intencji, żaden z tych wskaźników nie powinien być nigdzie indziej zwalniany ani modyfikowany.

    Czy problem jest skutkiem jakiegoś błędu który przeoczyłem w moim kodzie, czy też jest to wina Visual Studio?

    W załączniku jest aplikacja razem z plikami projektów Visual Studio i Code::Blocks.
    Załączniki:
    • TDNagegen.zip (39.22 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 12793381
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Niestety, łajba cieknie:

    ==16368==
    ==16368== HEAP SUMMARY:
    ==16368== in use at exit: 6,016 bytes in 2,479 blocks
    ==16368== total heap usage: 25,135 allocs, 22,656 frees, 5,225,392 bytes allocated
    ==16368==
    ==16368== LEAK SUMMARY:
    ==16368== definitely lost: 5,664 bytes in 2,478 blocks
    ==16368== indirectly lost: 0 bytes in 0 blocks
    ==16368== possibly lost: 0 bytes in 0 blocks
    ==16368== still reachable: 352 bytes in 1 blocks
    ==16368== suppressed: 0 bytes in 0 blocks
    ==16368== Rerun with --leak-check=full to see details of leaked memory
    ==16368==
    ==16368== For counts of detected and suppressed errors, rerun with: -v
    ==16368== ERROR SUMMARY: 2493 errors from 8 contexts (suppressed: 13 from 8)

    To jest analiza narzędziem "valgrind.org" które gorąco polecam poznać.

    Problem w tym, że przypadek poukładania pamięci przez GCC nie powoduje błędu a w zasadzie go nie ujawnia, co wcale nie znaczy że w GCC jest dobrze.
REKLAMA