• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Błąd debuggera

0 głosów
84 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez JAKUBW Pasjonat (21,000 p.)

Witam,

mógłby mi ktoś powiedzieć na czym polega problem zaznaczany przez debugger w tym kodzie?

Ogólnie to program wypisuje swoją nazwę oraz miejsce na dysku.

#include <iostream>

int main(int argc,char *argv[] )
{
    std::string temp = argv[0];
    std::string appName = "";
    std::string appLocation = "";
    for(unsigned int i = temp.length(); i >= 0 ; i--)
    {
        if(temp[i] == '\\')
        {
            for(unsigned int j = i+1; j < temp.length() ; j++)
                appName += temp[j];
            for(unsigned int j = 0 ; j<i; j++)
                appLocation += temp[j];
            break;
        }
    }
    
    std::cout<<appName<<std::endl;
    std::cout<<appLocation<<std::endl;

    return 0;
}

Nie wiem czy można nazwać to błędem, bo działa dobrze tylko gdy włączę debugger to zatrzymuje się w miejscu:

                appLocation += temp[j];

I pisze:

W czym probelm? Co robię źle?

Używam CodeBlocks.

Pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 2 sierpnia 2016 przez MetRiko Nałogowiec (36,830 p.)
wybrane 2 sierpnia 2016 przez JAKUBW
 
Najlepsza

Co do problemu.. Sygnał SIGSEGV jest zwracany jeżeli nastąpiła próba dostania się do zabezpieczonego obszaru pamięci.
Czytaj więcej: 
https://pl.wikipedia.org/wiki/Naruszenie_ochrony_pami%C4%99ci
Jeżeli kompilujesz program w wersji debug to debuger sam zadba o to by taka wartość nie została zmieniana.. natomiast na wersji release już nie.. dlatego wywala błąd. 
Winowajcą (prawdopodobnie) jest m.in. ta linijka:
for(unsigned int i = temp.length(); i >= 0 ; i--)
Do zmiennej [i] przypisujesz długość stringa [temp].. Jak wiadomo string jest tablicą znaków.. a tablice są indeksowane od 0 w takim razie pisząc temp[i].. modyfikujesz/sprawdzasz już część pamięci, która nie jest częścią stringa. Chociaż w tym wypadku temp[i] będzie wskazywać jeszcze na stringa.. dokładnie mówiąc na znak '\0'.
A jeżeli chodzi o sam program.. tu masz prostsze rozwiązanie x)
* funkcja std::rfind zwraca indeks znaku (wprowadzonego w pierwszym argumencie), zaczynając skanowanie od końca.

#include <iostream>

int main(int argc, char *argv[] )
{
    std::string temp=argv[0];

    std::string appName = temp.substr(0,temp.rfind('\\'));
    std::string appLocation = temp.substr(temp.rfind('\\')+1);
    //Dla optymalizacji możesz zapisać wartość temp.rfind('\\') w osobnej zmiennej x)

    std::cout<<appLocation<<'\n'<<appName<<'\n';
    return 0;
}

 

komentarz 2 sierpnia 2016 przez JAKUBW Pasjonat (21,000 p.)
Hmm, no nie wiedziałem o takich funkcjach jak string::substr() czy string::rfind(), więc zrobiłem to ręcznie. Ale dzięki za odpowiedź. Na pewno sobie poczytam o Naruszeniu ochrony pamięci.

Podobne pytania

0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 7 września 2017 w C i C++ przez Kafer Obywatel (1,930 p.)
0 głosów
0 odpowiedzi 28 wizyt
0 głosów
3 odpowiedzi 683 wizyt
pytanie zadane 21 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,990 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

64,959 zapytań

111,437 odpowiedzi

234,530 komentarzy

46,789 pasjonatów

Przeglądających: 112
Pasjonatów: 0 Gości: 112

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...