• 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

0 głosów
924 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,440 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,570 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ź 596 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)
0 głosów
1 odpowiedź 1,082 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 461 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...