struct X{
X() {f();}
virtual void f(){delete this;}
};
int main(){
//X x; // evil, 'delete this' is an error, because 'new' itself was not done
//x.f();
X *p = new X; // Ok, but 'p' now points to an already deleted memory
p->f(); // evil, double delete
}
Таким образом, самоуничтожение - это всегда сложная проблема.
Однако ваш вопрос касается самоуничтожения объекта и необязательного освобождения памяти, в которой он построен.
Это безопасно только в том случае, если есть уверенность, что объект был создан в ячейке памяти с использованием «размещения нового» * 1006 *
struct X{
X() {f();}
~X(){}
virtual void f(){this->~X();} // here an object destroys itself, but no memory deallocation is done. This is fine and safe as well.
};
int main(){
char *p = new char [sizeof(X)]; // assume alignment requirements are met
X *px = new (p) X();
delete [] p;
}