Здравствуйте.
Упрощённая модель "убивающего" себя объекта (субъекта-человека), программная реализация.
Делюсь размышлениями. Желающим пнуть по возможности поставлю блок.
Итак.
Допустим, есть желающий покончить с собой. Однако, покончить нужно таким образом, чтобы не оставить следов.
Где он? В какой-то глобальной хеш-таблице или векторе (допустим).
У него есть "метод" Free() или Release(), который освобождает все занимаемые им ресурсы.
И этот метод может быть вызван в момент самоубийства.
Теперь бы только удалиться из вектора! Как это сделать?
Не лучший вариант (это Java-код):
public void Release()
{
data = null;
RemoveFromGlobalList(this);
}
А что за функция RemoveFromGlobalList()?
приходит на ум такой её вид:
public static void RemoveFromGlobalList(CObject obj)
{
CResourceManager.RemoveFromList(obj);
//или через экземпляр
//resMng.RemoveFromList(obj);
}
Но откуда объекту знать о существовании менеджера? ну есть откуда, например передавать ссылку на него в конструктор объекта. Всегда ли это уместно? Думаю, что нет. Это похоже на "плохой" стиль программирования.

(хотя спорная вещь)
А что же остаётся? Вполне естественным представляется такое взаимодействие с менеджером объектов (который имеет ту самую хеш-таблицу), при котором он заведует удалением извне.
И происходить всё может в методах обновления, вот так:
для объекта:
public int Update()
{
if(subState == SUBSTATE_FULL_DEPRESS || IsLifeTheShit() == true)
{
boolean rez = fnTryToDieSomehow();
if(rez == true)
{
Release();
return STATE_DEAD;
}
}
return 0;
}
public void Release()
{
data = null;
}
для менеджера:
public int Update()
{
int rez;
CObject obj;
for(int k=0;k<objCount;++k)
{
obj = vectorObjs.elementAt(k);
rez = obj.Update();
if(rez == CObject.STATE_DEAD)
{
//obj.Release(); //можно тут освобождать память
vectorObjs.removeElementAt(k);
}
}
return 0;
}
Кстати, "data = null;" убивает указатель на данные, а сами данные живут до вызова System.gc(); (его аналога)
А какой интервал вызова жизненного коллектора?

может статься, что не мгновенный.
Ещё: коллектор удаляет те объекты, на которые больше нет ссылок. А на нашего самоубийцу такое распространяется-нет?
например:
man = new CObject();
man.SetName("Женя");
man.SetParents(papa, mama);
man.SetFriend(man1790897);
man24.SetFriend(man); ////ВНИМАНИЕ! ссылка на чувака у man24
и тут ещё:
public void SetParents(CObject pp, CObject mm)
{
papa = pp;
mama = mm;
pp.SetChild(this); //ВНИМАНИЕ! ссылка на чувака у папы
mm.SetChild(this); //ВНИМАНИЕ! ссылка на чувака у мамы
}
Конечно, менеджер объектов может занулить все ссылки на суицидника, однако на практике этого не происходит, часто остаётся "память".
Мораль сей басни такова: самоубийца может лишь освободить занимаемые им ресурсы, однако исчезнуть совсем - нет, и это уже решается на уровне менеджера объектов.
вот обновлённый апдэйт:
public int Update()
{
int rez;
CObject obj;
for(int k=0;k<objCount;++k)
{
obj = vectorObjs.elementAt(k);
rez = obj.Update();
if(rez == CObject.STATE_DEAD)
{
if(obj.GetExperience() >= MIN_EXP_FOR_RELEASE)
vectorObjs.removeElementAt(k);
else
RecreateObject(obj);
}
}
return 0;
}
ПС: видимая связь между моей подписью и этой статьёй отсутствует.
До свидания.