Могу ли я применить удаление к этому указателю внутри функции-члена?

Как я понимаю, если функция-член была вызвана с использованием указателя на объект, который выделяется динамически, объект получит удаление. Но если функция-член была вызвана с использованием объекта, который размещен статически, то что произойдет?

class sample
{
int i;
public:
void func()
{
delete this;
}
};

void main()
{
sample *s = new sample;

s->fun();
sample s1;
s1.fun();
}

1

Решение

Удаление указателя внутри функции-члена — это нормально, если вы знаете, как был выделен этот указатель. Нет никакого портативного способа узнать это только от одного указателя.

Если функции передается указатель, который не был выделен динамически, и функция вызывает delete по этому указателю это неопределенное поведение. Более того, даже указатели на динамические объекты, выделенные как массивы, не могут быть освобождены с помощью обычного delete оператор: вы должны использовать delete[] на них. Простое правило состоит в том, что когда вы не знаете происхождение указателя, вы не вызываете delete в теме.

2

Другие решения

Вы можете использовать только delete если объект был выделен с помощью new, Просто как тот. Поэтому первый пример, который вы дали, является законным, а второй — нет. Второй случай может привести к сбою или, что еще хуже, вызвать повреждение кучи и сбой при кажущемся случайном распределении памяти где-то далеко от проблемы.

2

Если вы вызываете delete изнутри в любой функции-члене объекта, которая статически размещена, то при вызове delete это произойдет сбой во время выполнения. Потому что, когда этот объект выйдет из области видимости, компилятор автоматически вызовет деструктор, который попытается удалить объект, которого больше не существует.

-1
По вопросам рекламы [email protected]