2015-05-30 1 views
0

Я пытаюсь изучить этот указатель в C++. Я создал указатель на объект класса и назначил функцию для удаления текущего объекта, но поведение неожиданно.Поведение удаления этого указателя в C++

Почему выход последнего оператора печати х = 0, у = 6.

#include<iostream> 
using namespace std; 

class Test 
{ 
private: 
    int x; 
    int y; 
public: 
    Test(int x = 6, int y = 6) { this->x = x; this->y = y; } 
    void setX(int a) { x = a; } 
    void setY(int b) { y = b; } 
    void destroy() { delete this; 
} 
    void print() { cout << "x = " << x << " y = " << y << endl; } 
}; 

int main() 
{ 
    Test *obj = new Test(); 
    Test objs; 
    obj->print(); 
    obj->destroy(); 

    obj->print(); 
    return 0; 
} 
+3

Поведение при удалении 'this' не определено. По крайней мере, поведение, доступное ему после этого, не определено. –

+3

Какое поведение вы ожидали? –

+0

Я понял, что после удаления этого указателя поведение не определено. Но почему значение задается как x = 0 и y = 6 –

ответ

3

Удаление this является законным, который вызывает деструктор класса

Однако, если объект не был выделено с использованием new, это будет неопределенное поведение

Но вы должны быть абсолютно уверены, что это будет последняя функция-член, вызываемая этим объектом, и ни одна из ваших функций-членов (после e delete this) вызывается через объект this, так как this станет висячим указателем, который не должен быть разыменован.

Если вы это сделаете, поведение будет неопределенным, поэтому вы можете увидеть что-нибудь в своем выходе.

+0

Большое вам спасибо за объяснение. –