Distruzione di un oggetto di una classe in modo corretto

1

Ho uno scenario, in cui disegno più grafici nelle stesse applicazioni e ogni grafico è un oggetto di classe di grafici.

Voglio eliminare il grafico utilizzando la gestione degli eventi (evento clic sul pulsante) e la gestione degli eventi avviene in classe di grafici e qui posso semplicemente chiamare il distruttore per cancellare questo oggetto.

C'è un modo per dire alla classe principale, da dove sto creando questi oggetti, su questo evento in modo che tutti questi riferimenti a oggetti possano essere cancellati?

    
posta neha 15.02.2016 - 15:29
fonte

1 risposta

5

I can simply call the destructor to delete this object.

No, non puoi.

Se sei membro di una classe e vuoi distruggere l'istanza di quella classe, chiamare this->~ClassName() è una idea terribile che si interromperà quasi sempre.

Oh, questo chiamerà il distruttore della classe. Ma non distruggerà la memoria associata a quell'istanza di classe. In modo che l'allocazione di memoria perdi.

Se sei membro di una classe e sei assolutamente certo che questa istanza di classe è stata allocata con new ClassName (e non new ClassName[3] o new(someMemory) ClassName o ClassName varName ), quindi puoi eseguire delete this; .

Is there a way to tell the main class,from where I am creating these objects, about this event so that all this object references can be deleted ?

Bene, non hai parlato molto della natura del tuo sistema. Sembra che tu abbia una "classe principale" e tu abbia un po 'di "classe di grafico". E affermi che, quando la "classe del grafico" viene distrutta, la "classe principale" deve essere notificata in modo che i "riferimenti oggetto" possano essere "cancellati" (cioè: le classi devono essere distrutte).

Se questo è il caso, allora mi sembra che il tuo problema sia che questo sistema ha una semantica della proprietà non chiara. Quando un oggetto ha la proprietà su un altro oggetto, allora la distruzione dell'oggetto proprietario causerà la distruzione dell'oggetto di sua proprietà. Il contenimento del valore (es .: oggetti membro non puntatore) hanno questa relazione di proprietà con gli oggetti che li contengono. I membri di una classe vengono distrutti quando la classe di cui sono membri viene distrutta.

Se questi "riferimenti oggetto" sono oggetti che devono essere distrutti quando un grafico viene distrutto, il grafico dovrebbe possedere quegli oggetti. Pertanto, il grafico stesso dovrebbe essere responsabile della loro distruzione. In C ++ 11, tali relazioni di proprietà sono solitamente espresse da classi come unique_ptr e shared_ptr .

Quindi l'oggetto grafico non dovrebbe dover informare nessuno di niente. Dovrebbe essere responsabile (in modo univoco o condiviso) per eliminarli.

Se questi "riferimenti a oggetti" sono solo puntatori, devi annullare l'operazione (perché distruggendo il grafico hanno distrutto gli oggetti a cui puntano), allora hai tre scelte:

  1. Rimuovi questi puntatori "riferimenti agli oggetti" dalla classe principale. I puntatori non possedere sono pericolosi quando la semantica della proprietà del codice è confusa. E i tuoi sono.

  2. Chiedi al distruttore del grafico di informare la classe principale che questi oggetti stanno per essere distrutti. Questo sarebbe fatto ottenendo un puntatore a quella classe e chiamando una funzione.

  3. Chiedi al grafico di utilizzare shared_ptr di proprietari di essi, il che consente alla classe principale di utilizzare weak_ptr s come "riferimenti a oggetti".

risposta data 15.02.2016 - 16:34
fonte

Leggi altre domande sui tag