Powiedzmy w klasie, a mam wskaźnik do wektora pełnego wskaźników do klasy b

Class A {
    ....
    std::vector<B *>* table;
    ....
}

Class B {
     int var1;
     int var2;
     B (const int _var1, const int _var2){
          var1 = _var1;
          var2 = _var2;
     }
}

Jak mogę przejść do usuwania stołu w klasie A w swoim destruktorze?

Próbowałem

    ~A()
    {
        for (int i = 0; i < table->size(); i++)
        {
            delete (*table)[i];
        }
        delete[] table;
    }

Ale z jakiegoś powodu daje błąd SEG w destruktorze.

Dzięki za pomoc!

-1
BlueXhusky 12 marzec 2020, 22:53

2 odpowiedzi

Najlepsza odpowiedź

Twoja segfault jest spowodowana przez tę linię:

delete[] table;

Co mówi kompilatorowi, który chcesz usunąć tablicę. table nie jest tablicą, chociaż może działać tak, jest to wskaźnik do obiektu single obiektu na sterty i wywołanie {x1}} (zamiast {x2}} (zamiast {x2}} (zamiast {x2}} ) zatem powoduje niezdefiniowane zachowanie.

Jako zasadę, nigdy nie używaj nagich wskazówek. Jeśli użyjesz nagie wskazówki zawsze używaj tego samego formularza dla delete, jak zrobiłeś dla new.

Jak wskazano w komentarzach, w nowoczesnym C ++, NIGDY NIGDY NIGDY NIGDY Masz pojemnik pełen nagiego wskaźników (nagich wskazówek to wskaźniki, które nie są zarządzane przez obiekt opakowany za pomocą RAII).

Dlatego należy użyć czegoś takiego jak std::unique_ptr<B> lub std::shared_ptr<B> zamiast B* w twoim wektorze. Nie powinieneś też mieć wskaźnika std::vector i zamiast tego powinno się kopiować lub poruszać (jeśli kopiowanie jest drogie) wektor na miejscu. Użyj inteligentnych wskazówek zamiast nagiego wskaźników, a to miejmy nadzieję, że ponownie: str.

2
Firefly 12 marzec 2020, 20:30

Dostajesz błąd segmentacji z powodu oświadczenia delete[] table w destruktorze.

Wymień delete[] table; za pomocą just delete table;.

-1
VHS 13 marzec 2020, 00:38