Debug Asertion Failed przy dynamicznie alokowanej tablicy
Ostatnio zmodyfikowano 2017-01-05 00:51
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". 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. |
|
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ę ++
|
|
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. |
|
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. |
|
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ę ++. |
|
vizzars Temat założony przez niniejszego użytkownika |
Re » 2017-01-04 22:44:20 Ok, dzięki |
|
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ć. |
|
« 1 » |