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

Problem z usuwaniem wskaźników C++

Cloud VPS
0 głosów
420 wizyt
pytanie zadane 5 czerwca 2023 w C i C++ przez p4wix Obywatel (1,040 p.)

Hej, mam problem postaram się go w skrócie opisać:

Mam klasę A, B, C. Klasa B dziedziczy publicznie po klasie A.
W metodzie w klasie C tworzę wskaźniki klasy A które wykonując funkcję virutalną która jest przeciążana dla kasy B. Wskaźniki zapsuję sobie powiedzmy w tablicy. Kiedy obiekt klasy B osiągnie pewien stan wykonuję delete wskaźnik A. I teraz w debugerze widzę, że usuwa się tylko obiekt klasy B a nie klasy A.
Jeśli chodzi o virtualne destruktory to są dla obudówch klas.

virtual ~A();
A::~A() = default;

~B() override;
B::~B() = default;

Liczę że w miarę dobrze opisałem problem, z góry dzięki za pomoc :)

 
komentarz 6 czerwca 2023 przez Oscar Nałogowiec (29,360 p.)
A dokładnie to w jaki sposób "I teraz w debugerze widzisz, że usuwa się tylko obiekt klasy B a nie klasy A. "

2 odpowiedzi

+1 głos
odpowiedź 6 czerwca 2023 przez tangarr Mędrzec (155,180 p.)

Przetestuj kod

#include <iostream>

class A {
public:
    A() {
        std::cout << "Konstruktor A" << std::endl;
    }
    virtual ~A() {
        std::cout << "Destruktor A" << std::endl;
    }
};

class B : public A {
public:
    B() {
        std::cout << "Konstruktor B" << std::endl;
    }
    ~B() override {
        std::cout << "Destruktor B" << std::endl;
    }
    
};

int main()
{
    A *ptr = new B();
    delete ptr;
    return 0;
}

 

+1 głos
odpowiedź 28 czerwca 2023 przez Eriss69 Gaduła (4,470 p.)
class A {
public:
    virtual ~A() = default;
};

class B : public A {
public:
    virtual ~B() {
        // Wywołanie destruktora klasy A
        // Jeśli A zawiera inne zasoby, które również trzeba zwolnić,
        // to należy to zrobić tutaj przed wywołaniem destruktora A.
    }
};

class C {
public:
    void someFunction() {
        A* ptrA = new B();
        // Dodaj wskaźnik ptrA do tablicy lub innej struktury danych.
        // ... foo foo foo
        // Kiedy obiekt klasy B osiągnie pewien stan, usuń wskaźnik.
        delete ptrA;  // Wywołuje destruktor klasy B i A.
    }
};

 

Podobne pytania

0 głosów
1 odpowiedź 714 wizyt
0 głosów
2 odpowiedzi 332 wizyt
0 głosów
2 odpowiedzi 318 wizyt

93,469 zapytań

142,404 odpowiedzi

322,707 komentarzy

62,852 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
...