Po wprowadzeniu kill
, m[1]
(od m[1].kill(m, 1);
) oświadczenie zostało w pełni ocenione jako przedmiot foo
dzwonisz kill
dalej.
Następnie wykonuje się m.erase(i);
, kończąc niszczenie bieżącego obiektu foo
.
ile piszesz żadnego oświadczenia użyciu bieżącego obiektu (this
) przed powrotem z funkcji kill
, to całkowicie dopuszczalne i bezpieczne (jak komentował słupkami odwołuje Auriga i Barry). Nawet jeśli bieżący obiekt już nie istnieje, twoja funkcja powróci bezpiecznie ze stosu, nie ma powodu, by zawieść, o ile wiem.
Jako ilustracja, byłoby to skończyć z niezdefiniowanej zachowań i nie może być dokonana:
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;
};
Więc powiedzmy, że to co robisz jest ryzykowne, ale ważne i bezpieczne, jeśli robisz to dobrze.
Jako ilustrację, to byłoby skończyć z określonym zachowaniem i może odbywać się:
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
int theAttribute = attribute;
m.erase(i);
cout << theAttribute; // OK!
}
int attribute;
};
uwzględniając sposób usunąć bieżący obiekt prawdopodobnie nie jest to dobra praktyka, mimo to (szczególnie jeśli inny deweloper modyfikuje kod później ... mógł łatwo spowodować awarię z pierwszym przykładem powyżej). Przynajmniej umieścić wyraźny komentarz w kodzie powiedzieć bieżący obiekt mógł zostać zniszczony (zauważ, że kill
może zniszczyć bieżący obiekt, drugi lub brak ... W zależności od treści i i
m
):
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!
}
};
Tak, może. http://stackoverflow.com/questions/862093/object-delete-itself-from-container – Auriga
Zasadniczo taka sama zasada jak ["usuń to;"] (http://stackoverflow.com/q/3150942/2069064) – Barry