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

Dlaczego pamięć "zwalnia się dwa razy"

Cloud VPS
0 głosów
252 wizyt
pytanie zadane 22 listopada 2015 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

Witam, przeglądając kurs c++ MZ na YT, a konkretnie odcinek o wskaźnikach w pierwszym programie
( kod poniżej )  Visual Studio wyrzuca mi tutaj error, konkretnie mówi, że znalazł breakpoint.

Doszedłem do tego, że problem pojawia się przy zwalnianiu pamięci ( kiedy usunę linijke delete [] tablica; problem nie występuje ). W teorii pamięć została zwolniona już wcześniej, ale wobec tego gdzie?

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
	int ile;

	cout << "Ile chcesz miec miejsc w tablicy?: ";
	cin >> ile;

	int *tablica;

	tablica = new int[ile];


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

		cout << (int)tablica << endl;
		tablica++;


	}


	delete [] tablica;

	_getch();
}

 

1 odpowiedź

+2 głosów
odpowiedź 22 listopada 2015 przez draghan VIP (106,230 p.)
wybrane 22 listopada 2015 przez Sinnley
 
Najlepsza
Ty  musiałeś coś kliknąć. :P Breakpoint ustawia programista w celu zatrzymania przebiegu programu przy debugowaniu.

A tak przy okazji - pamięć alokowana dynamicznie nie zwalnia się sama. ;)
komentarz 22 listopada 2015 przez Porcupine Nałogowiec (31,560 p.)
Chyba to nie on bo ja na jego kodzie też dostaje:

a.out(13390,0x7fff7a69b300) malloc: *** error for object 0x7f9a4bd00010: pointer being freed was not allocated

*** set a breakpoint in malloc_error_break to debug
komentarz 22 listopada 2015 przez draghan VIP (106,230 p.)
W takim razie włączam IDE i sprawdzam osobiście. :)
komentarz 22 listopada 2015 przez draghan VIP (106,230 p.)

Już wiem, co jest grane. :) Podajesz do operatora delete[] wskaźnik, który został zwiększony i w konsekwencji wskazuje poza tablicę. Należy cofnąć ten wskaźnik na początek tablicy i wtedy wysłać go do delete[], np. tak:

    tablica -= ile;
    delete [] tablica;

 

komentarz 22 listopada 2015 przez Sinnley Stary wyjadacz (12,810 p.)
Ale czy w tym momencie usuwam wskaźnik, czy tylko zarezerwowaną pamięć?
komentarz 22 listopada 2015 przez draghan VIP (106,230 p.)

Wskaźnik zostaje i możesz go nadal używać, oczywiście jeśli przypiszesz do niego jakąś sensowną wartość. Zwalniasz tylko zaalokowane zasoby. Spójrz na ten przykład:

#include <iostream>

using namespace std;

int main()
{
    int ile;

    cout << "Ile chcesz miec miejsc w tablicy?: ";
    cin >> ile;

    int *tablica;

    tablica = new int[ile];


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

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

    tablica -= ile;
    delete [] tablica;
    // ponowne użycie wksaźnika...
    tablica = new int[15];
    for(unsigned i = 0; i < 15; ++i)
    {
        tablica[i] = i * 2;
    }

    for(unsigned i = 0; i < 15; ++i)
    {
        cout<<tablica[i]<<endl;
    }
    delete[] tablica; // tym razem poprawnie zwalnia pamięć, bo nie modyfikowaliśmy adresu wskaźnika
    return 0;
}

 

Podobne pytania

+1 głos
1 odpowiedź 309 wizyt
pytanie zadane 12 września 2016 w C i C++ przez Ciartek Nowicjusz (210 p.)
0 głosów
1 odpowiedź 365 wizyt
pytanie zadane 2 października 2015 w C i C++ przez Sedi Stary wyjadacz (10,200 p.)
+1 głos
5 odpowiedzi 6,754 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

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

Kursy INF.02 i INF.03
...