Как я понимаю, если функция-член была вызвана с использованием указателя на объект, который выделяется динамически, объект получит удаление. Но если функция-член была вызвана с использованием объекта, который размещен статически, то что произойдет?
class sample
{
int i;
public:
void func()
{
delete this;
}
};
void main()
{
sample *s = new sample;
s->fun();
sample s1;
s1.fun();
}
Удаление указателя внутри функции-члена — это нормально, если вы знаете, как был выделен этот указатель. Нет никакого портативного способа узнать это только от одного указателя.
Если функции передается указатель, который не был выделен динамически, и функция вызывает delete
по этому указателю это неопределенное поведение. Более того, даже указатели на динамические объекты, выделенные как массивы, не могут быть освобождены с помощью обычного delete
оператор: вы должны использовать delete[]
на них. Простое правило состоит в том, что когда вы не знаете происхождение указателя, вы не вызываете delete
в теме.
Вы можете использовать только delete
если объект был выделен с помощью new
, Просто как тот. Поэтому первый пример, который вы дали, является законным, а второй — нет. Второй случай может привести к сбою или, что еще хуже, вызвать повреждение кучи и сбой при кажущемся случайном распределении памяти где-то далеко от проблемы.
Если вы вызываете delete изнутри в любой функции-члене объекта, которая статически размещена, то при вызове delete это произойдет сбой во время выполнения. Потому что, когда этот объект выйдет из области видимости, компилятор автоматически вызовет деструктор, который попытается удалить объект, которого больше не существует.