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

Debug Assertion Failed C++ / Dynamiczna alokacja pamięci

Object Storage Arubacloud
0 głosów
780 wizyt
pytanie zadane 13 lipca 2017 w C i C++ przez Przemek Turalski Nowicjusz (150 p.)
edycja 13 lipca 2017 przez Przemek Turalski

Witam !

Mam następujący problem :

 
 

#include<iostream>

using namespace std;

int main() {

    int how_many;

    cout << "How many elements in array? " << endl;

    cin >> how_many;

    
    int *array;

  
    array = new int[how_many];

    for (int i = 0; i < how_many; i++) {

        cout << (int)array << endl;
        array++;
    }

    delete [] array;    

    return 0;
}


Podany kod kompiluje się, jednak po odpaleniu programu wyskakuje następujący komunikat:

https://zapodaj.net/0d64cc1269ee5.png.html

Ps. Podany kod nie jest skończony oczywiście jednak ta część powinna działać (fragment kodu z kursu Pana Mirosława, który już w tej fazie działał Panu Zelentowi).

2 odpowiedzi

+2 głosów
odpowiedź 14 lipca 2017 przez Bondrusiek Maniak (61,370 p.)
wybrane 14 lipca 2017 przez Przemek Turalski
 
Najlepsza

Witam,

spróbuj sobie zapisać w zmiennej adres pierwszego elementu array. W pętli edytujesz tą wartość i warto aby po jej wyjściu znać ten adres i przesłać go do delete.

Spróbuj tak:

#include<iostream>


using namespace std;

int main() {

    int how_many ;

    cout << "How many elements in array? " << endl;

    cin >> how_many;


    int *array;


    array = new int[how_many];

    int *wskNaPierwszyElement = array;//zapis adresu array
    for (int i = 0; i < how_many; i++)
    {
        cout << (int)array << endl;
        array++;//edytujesz adres array
    }


    array = wskNaPierwszyElement; //z powrotem przypisujesz array wartosc 1 elementu
    delete [] array;


    return 0;
}

 

komentarz 14 lipca 2017 przez NaviFox Dyskutant (8,950 p.)

Dodatkowo w linii

cout << (int)array << endl;

rzutowanie na 64bitowej platformie może się nie powieść i dostaniesz błąd o utracie precyzji ponieważ typ int nie ma tego samego rozmiaru co wskaźnik więc lepiej użyć typu (long) do rzutowania a jeszcze lepiej (intptr_t) z biblioteki <cstdint> ponieważ long na 64bitowym windowsie ma cały czas 32bity a wskaźnik 64.

0 głosów
odpowiedź 13 lipca 2017 przez criss Mędrzec (172,590 p.)
delete[] musi dostać to samo co otrzymałeś od new[]. Inkrementujesz wskaźnik, więc do delete[] idzie co innego.

PS: wstaw kod w bloczek kodu (ikonka {...} w edytorze).

Podobne pytania

0 głosów
1 odpowiedź 427 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 885 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 247 wizyt

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...