Quando si immette la kill
, m[1]
(da m[1].kill(m, 1);
) dichiarazione è stata completamente valutata come l'oggetto che si sta chiamando foo
kill
on.
Quindi si esegue m.erase(i);
terminando la distruzione dell'oggetto corrente foo
.
Per quanto si scrive assolutamente alcuna dichiarazione utilizzando l'oggetto corrente (this
) prima di tornare dalla funzione kill
, che è perfettamente accettabile e sicuro (come ha commentato dai messaggi a cui fa riferimento Auriga e Barry). Anche se l'oggetto corrente non esiste più, la tua funzione tornerà in modo sicuro dalla pila, senza alcun motivo per farlo fallire per quanto ne so.
titolo di esempio, questo finirebbe con comportamento non definito e non deve essere fatto:
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
m.erase(i);
cout << attribute; // don't do that! current foo object does not exist anymore
}
int attribute;
};
Quindi diciamo che quello che stai facendo è rischioso, ma valido e sicuro se lo fai bene.
titolo di esempio, questo finirebbe con comportamento definito e può essere fatto:
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
int theAttribute = attribute;
m.erase(i);
cout << theAttribute; // OK!
}
int attribute;
};
Avere un metodo eliminare l'oggetto corrente non è probabilmente una buona pratica in ogni caso (specialmente se un altro sviluppatore modifica il codice in seguito ... potrebbe facilmente farlo andare in crash con il primo esempio sopra). Almeno porre commento esplicito nel codice per dire l'oggetto corrente avrebbero potuto essere distrutte (si noti che kill
potrebbe distruggere l'oggetto corrente, un altro, o nessuno ... a seconda m
contenuti e i
):
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
m.erase(i);
// careful! current object could have been destroyed by above statement and may not be valid anymore! Don't use it anymore!
}
};
Sì, è possibile. http://stackoverflow.com/questions/862093/object-delete-itself-from-container – Auriga
Fondamentalmente lo stesso principio di ['delete this;'] (http://stackoverflow.com/q/3150942/2069064) – Barry