Niszczenie obiektu po wywołaniu funkcji

0

Witam
Mam taki kod:

class A 
{
void funkcja()
{
koniec();
}

void koniec()
{
}
};

A *obiekt = new A;

Chodzi mi o to, aby przy wywołaniu funkcji koniec obiekt obiekt się usunął. Jak tego dokonać? W funkcji koniec umieścić delete this;?

0

Po prostu to jest klasa okna. Te okna mają być tworzone dynamicznie, bo nie wiem ile ktoś chciałby ich otworzyć. Chciałbym to teraz wrzucić w std::vector. Tylko jest taki problem, że obiekt trzeba zniszczyć po kliknięciu na przycisk "Zamknij okno", czyli po wywołaniu odpowiedniej funkcji.

0

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

#include <iostream>

class Window {
    int id;
public:
    Window(int id) : id(id) { std::cerr << "ctor(" << id << ")\n"; }
    ~Window() { std::cerr << "dtor(" << id << ")\n"; }
    
    void seppuku() {
        std::cerr << "seppuku(" << id << ")\n";
        delete this;
    }
};

int main() {
    using namespace std;
    
    Window* win = new Window(1);
    win->seppuku();
    win = nullptr;
    
    (new Window(2))->seppuku();
    
    return 0;
}

Zadziała. Ale czy na pewno musisz się uciekać do tej "magii"? :) Jeśli wskaźniki trzymasz w wektorze to może wystarczy pozwolić im umrzeć (shared_ptr), albo przed usunięciem z wektora zwolnić - przez delete.

0

Mam tak:

class OknoDodajUzytkownika
{
public:
void on_dodaj_clicked()
{
// Wcisnięto dodaj - zamknij okno
}
};

class OknoGlowne 
{
public :
vector<OknoDodajUzytkownika> lista_okien;

void zamknij_okno_glowne()
{
// zamykamy okno główne, niszcząc inne otwarte okna
}
}; 
0

No dobrze, ale w tym momencie kiedy vector zostanie zniszczony, zniszczone zostaną również wszystkie obiekty, które on przechowuje. W którym miejscu chcesz popełnić samobójstwo - w OknoGlowne::zamknij_okno_glowne()?

0

W void on_dodaj_clicked()
Wiem, że zostaną usunięte okna przy niszczeniu, i że trzeba uważać, by nie zniszczyć dwa razy tego samego okna. Głównie chodzi mi o to, aby okno po spełnieniu swojej funkcji posprzątało swoje śmieci. Program może być przecież uruchomiony długo, a okno wywoływane wiele razy. Takie, które po sobie nie będzie sprzątało będzie zapychało pamięć.

0

No dobrze, widzę że się nie rozumiemy. ;) Jak tworzysz to okno? Po prostu dodajesz je do wektora? Jeżeli tak, to usuń je z wektora i voila, obiekt zostanie zniszczony.
W tej chwili to nie widzę w ogóle zastosowania dla naszego "seppuku". Przecież w wektorze przechowujesz obiekty a nie wskaźniki do nich.

1 użytkowników online, w tym zalogowanych: 0, gości: 1