當你進入你的kill
,m[1]
(從m[1].kill(m, 1);
)語句已充分評估爲你在調用kill
的foo
對象。
然後你做m.erase(i);
結束破壞當前對象foo
。
至於你使用當前對象(this
)寫絕對沒有聲明,你從kill
函數返回前,這是完全可以接受的,安全的(如由Auriga和Barry引用的帖子評論)。即使當前對象不再存在,你的函數也會從堆棧中安全地返回,據我所知沒有理由失敗。
作爲一個例證,這最終會與不確定的行爲,一定不能做的:
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;
};
所以我們可以說,你在做什麼,如果你把它做好是有風險的,但有效的,安全的。
作爲一個例證,這最終會與定義的行爲,可以DONE:
struct foo
{
void kill(std::map<int, foo>& m, int i)
{
int theAttribute = attribute;
m.erase(i);
cout << theAttribute; // OK!
}
int attribute;
};
有一個方法刪除當前對象可能不是一個好的做法呢(特別是如果另一個開發者後來修改了代碼...他可以很容易地使它與上面的第一個例子崩潰)。至少把一個明確的註釋在代碼中告訴當前對象可能已被銷燬(注意kill
可能會破壞當前對象,一個又一個,或無...取決於m
內容和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!
}
};
是的,它可以。 http://stackoverflow.com/questions/862093/object-delete-itself-from-container – Auriga
基本上與['delete this;'](http://stackoverflow.com/q/3150942/2069064)相同的原理 – Barry