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

Obiekt istnieje po zniszczeniu

Object Storage Arubacloud
0 głosów
226 wizyt
pytanie zadane 7 marca 2016 w C i C++ przez Exus Początkujący (420 p.)

Witam.

Może mi ktoś wytłumaczyć jak ten kod działa skoro niszczę utworzony obiekt wskaźnik ustawiam na NULL po czym mój program nie ma problemu żeby odwołać się do zniszczonego obiektu i wyświetlić napis "LOL"?

#include <stdio.h>
#include <string>
#include <iostream>

using namespace std;

class Ctest {
public:
	void show() {
		cout << "LOL" << endl;
	}
};



int main(int argc, char **argv)
{
	Ctest *tt = new Ctest();
	
	
	tt->show(); // Tutaj wyświetla bo powinien
	delete(tt);
	tt = NULL;
	tt->show(); // Ale tutaj chyba już nie powinien?
	
	
	int test;
	cin >> test;
	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 7 marca 2016 przez draghan VIP (106,230 p.)

Zauważ, że metody klas nie są przypisane do konkretnych obiektów, tylko do klasy jako całości.

Jeśli metoda wykorzystywałaby odwołania do danych, przechowywanych w instancji klasy, wtedy dostałbyś błąd wykonania (odwoływałbyś się do adresu, do którego albo nie masz dostępu albo pod którym nie ma danych klasy).

Minimalnie zmodyfikowany kod, ilustrujący to co napisałem:

#include <string>
#include <iostream>

using namespace std;

class Ctest {
    int x;
public:
    Ctest(int i):x(i){}
    void show() {
        cout << "LOL" << x << endl;
    }
};



int main(int argc, char **argv)
{
    Ctest *tt = new Ctest(12);

    tt->show(); // Tutaj wyświetla bo powinien
    delete(tt);

    /*  w metodzie odwołujemy się do danych, posiadających adres,
        do którego już nie mamy dostępu - czasami się uda, czasami
        nie - generalnie nie powinniśmy już używać tego wskaźnika po zwolnieniu pamięci,
        ta operacja jest nieprawidłowa:
    */
    tt->show();

    tt = NULL;
    tt->show(); // tutaj naturalnie również nie zadziała



    int test;
    cin >> test;
    return 0;
}

Nie jestem pewny, czy to co pokazałeś nie jest przykładem UB.

komentarz 8 marca 2016 przez niezalogowany
Co to jest UB
komentarz 8 marca 2016 przez Radfler VIP (101,030 p.)
Undefined behaviour, czyli niezidentyfikowane zachowanie. Wróg każdego programisty C++ ;)
komentarz 8 marca 2016 przez niezalogowany
pierwsze słyszę, muszę o tym poczytać.
komentarz 8 marca 2016 przez niezalogowany
dodam do ulubionych i gdy będę mieć więcej czasu to poczytam :)

Podobne pytania

0 głosów
0 odpowiedzi 187 wizyt
pytanie zadane 25 października 2019 w Python przez Dawid89 Obywatel (1,120 p.)
0 głosów
2 odpowiedzi 202 wizyt
pytanie zadane 12 czerwca 2017 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)
0 głosów
1 odpowiedź 591 wizyt

92,755 zapytań

141,677 odpowiedzi

320,418 komentarzy

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

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!

...