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;?
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;?
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.
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
.
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
}
};
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()
?
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ęć.
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.