2015-05-12 4 views
1

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

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

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

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

Приведите пример как может быть? – JCx

+0

Должно зависеть от управления кучей, вы наверняка получите ошибку, пытаясь освободить недопустимый блок. – fassl

+0

Каковы были ваши результаты при попытке? –

ответ

2

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

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

-1

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

+0

'удаление объекта в стек уже сбой. – nwp

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^