Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Debug Asertion Failed przy dynamicznie alokowanej tablicy

Ostatnio zmodyfikowano 2017-01-05 00:51
Autor Wiadomość
vizzars
Temat założony przez niniejszego użytkownika
Debug Asertion Failed przy dynamicznie alokowanej tablicy
» 2017-01-04 22:22:03
Napisałem prosty program wyświetlający adresy komórek w tablicy stringów, o rozmiarze podanej przez użytkownika.
Wyświetlać, wyświetla, ale w momencie gdy program ma kończyć swoją pracę wywala błąd "Debug Asertion Failed".

C/C++
int main()
{
    int x = 0;
    scanf_s( "%d", & x );
    string * linia;
    linia = new string[ x ];
    for( int i = 0; i < x; i++ )
    {
        cout << linia << endl;
        linia++;
    }
    _getch();
    delete[] linia;
    return 0;
}

Expression: "(_Prt_user & (_BIG_ALLOCATION_ALLIGMENT - 1)) == 0" &&0

Zapewne chodzi o odwołanie się tablicy do nieswojej komórki? Tylko dlaczego wyświetla poprawnie?
W jaki sposób ustrzec się przed takimi błędami w przyszłości. Wygląda groźnie. Pozdrawiam.
P-155988
Monika90
» 2017-01-04 22:25:55
Chodzi o linia++

Żeby się ustrzec, zamiast zwykłego wskaźnika można użyć inteligentnego, czyli std::unique_ptr<std::string[]>, który nie pozwala na nonsensowną operację ++
P-155990
vizzars
Temat założony przez niniejszego użytkownika
Re
» 2017-01-04 22:37:19
Sorry, ale nic nie wyjaśniłaś.
Mam mam odczytać adresy kolejnych np. 6 komórek pamięci i po wprowadzeniu liczby 6 te adresy się wyświetlają.
Na wielu kursach opisywana jest metoda zwiększania wskaźnika o jeden metodą wskaźnik++.
Niestety nic nie słyszałem o twoich "inteligentnych" wskaźnikach i wolałbym używać tych standardowych.
 
P-155993
pekfos
» 2017-01-04 22:41:15
Do delete ma trafić dokładnie ten adres, jaki dostałeś od new. Przypisz więc ten adres do dwóch wskaźników i jeden modyfikuj jak chcesz, drugiego użyj do zwolnienia pamięci.

Na wielu kursach opisywana jest metoda zwiększania wskaźnika o jeden metodą wskaźnik++.
Możesz użyć zwykłego +. wskaznik + i, gdzie wskaznik się nie zmienia, a i to zmienna z pętli.
P-155995
Monika90
» 2017-01-04 22:43:16
Zadaniem wskaźnika linia powinno być przechowywanie adresu początku tablicy, czyli tego adresu zwróconego przez operator new, ponieważ to ten adres trzeba będzie przekazać do delete. Z powodu zwiększania wskaźnika linia delete dostaje nieprawidłowy adres i program się wywala. Zrób sobie wskaźnik pomocniczy i na nim wykonuj operację ++.
P-155996
vizzars
Temat założony przez niniejszego użytkownika
Re
» 2017-01-04 22:44:20
Ok, dzięki
P-155997
mokrowski
» 2017-01-05 00:51:57
std::string klasą kontenera która w ramach wewnętrznej struktury przechowuje dane ciągu znaków. Standard wymaga aby przechowywanie odbywało się w pamięci ciągłej, nie precyzuje algorytmu alokacji i realokacji danych. To co próbowałeś robić to (nieudane) przejście po adresach pamięci zajętych przez _obiekt_ string'a a nie jego dane. Dane może mieć (i najczęściej ma) gdzieś indziej. Ze string'a dostaniesz wskaźnik na nie wywołując na nim data(). Po operacji na string'u, wskaźnik ten może się jednak zdezaktualizować.
P-156010
« 1 »
  Strona 1 z 1