Вы не можете проверить, существует ли базовый объект (например, был ли он «удален»). Есть некоторая «хитрость», которую вы можете использовать для «своего рода» помощи, но я не рекомендую ее. Скорее, IMHO, я предполагаю, что вашему дизайну не хватает строгой семантики владения. (Это может быть необходимо в зависимости от сложности проблемы и вашего домена, но я бы рекомендовал против этого, если этого можно избежать.)
Ваша проблема - семантика владения. Особенно в C ++, в отличие от других языков, которые используют «сборку мусора» в памяти, вы ДОЛЖНЫ иметь проект, в котором вы хорошо понимаете, «кому что принадлежит». Ваш дизайн должен сделать «легким и очевидным», чтобы знать, какие объекты существуют, и кто «владеет» ими.
Как правило, это означает централизацию «создания» и «удаления» объектов в «родителя» какого-либо рода, где никогда не возникает вопроса: «Чей это объект?» и "Какими объектами вы управляете?"
Например, класс «Parent» будет выделять объекты-члены, которые ему «нужны», и только этот родитель удаляет эти объекты. Деструктор родителя гарантирует, что эти члены будут удалены, поэтому эти объекты не будут случайно «оставлены». Таким образом, родитель «знает» свои объекты-члены, и когда родитель исчезает, вы ЗНАЕТЕ, что объекты-члены также исчезли. Если ваш проект сильно связан, то объекты-члены могут ссылаться на родительский объект, но это «глубокий конец пула» для семантики владения (и обычно не рекомендуется).
Некоторые проекты на законных основаниях могут быть очень сложными. Однако в общем случае семантика владения НИКОГДА не должна быть сложной: вы должны ВСЕГДА знать, «кому что принадлежит», и, следовательно, вы должны ВСЕГДА знать, «какие объекты существуют».
Возможны другие конструкции с языками сборки мусора, где объекты могут быть «свободными агентами», и вы доверяете сборщику мусора выполнять «тяжелую работу» по очистке объектов, о которых вы потеряли отслеживание. (Я не неравнодушен к этим проектам, но допускаю, что они иногда приемлемы на этих других языках, основываясь на уникальных проблемных областях.)
Если ваша конструкция на C ++ основана на таких объектах «свободных агентов», вы можете написать свой собственный сборщик мусора или собственный «владелец утилиты» для их очистки. Например, конструктор MyFreeAgent
может зарегистрировать себя в MyGarbageCollector
, а деструктор MyFreeAgent
отменит свою регистрацию в MyGarbageCollector
. Таким образом, MyFreeAgent
экземпляры могут быть "очищены" с помощью MyGarbageCollector
, или MyFreeAgent
может даже убить себя с помощью "delete this;
", и вы ЗНАЕТЕ, что оно исчезло (потому что его деструктор отменит свою регистрацию от MyGarbageCollector
). В этом проекте один MyGarbagageCollector
ВСЕГДА "знал бы", что существует MyFreeAgent
экземпляров.
Такие конструкции являются «глубоким концом пула» и должны использоваться с особой осторожностью, даже если они работают, потому что они имеют большой потенциал для массовой деструктуризации вашей системы. (Я использовал их, но вы получили , чтобы убедиться, что проблема честно оправдывает такой дизайн.)