Destructor
は、オブジェクトが有効範囲外になるか、または割り当てられたメモリがdelete
演算子を使用して割り当て解除されたときに呼び出されることを学びました。C++のデストラクタ呼び出し
#include <iostream>
using namespace std;
class point
{
private:
int x_coord;
int y_coord;
public:
point()
{
x_coord = 0;
y_coord = 0;
}
point(int x, int y)
{
x_coord = (x > 79 ? 79 : (x < 0 ? 0 : x));
y_coord = (y > 79 ? 79 : (y < 0 ? 0 : y));
}
~point()
{
cout << "Destructor invoked\n";
}
int getx(void)
{
return x_coord;
}
int gety(void)
{
return y_coord;
}
};
int main()
{
point p1;
point p2(20, 80);
point *p3 = new point;
cout << "p1.x = " << p1.getx() << ": p1.y = " << p1.gety()<< "\n";
cout << "p2.x = " << p2.getx() << ": p2.y = " << p2.gety()<< "\n";
cout << "p3->x = " << p3->getx() << ": p3->y = " << p3->gety()<< "\n";
point * p4 = &p1;
delete p4;
delete p3;
return 0;
}
- P1に割り当てられたメモリは、
delete p4
を用いて脱割り当てられます。したがって、デストラクタが呼び出されます delete p3
は、次のデストラクタを呼び出します。- p2が範囲外になり、次のデストラクタが呼び出されます。
デストラクタは3回しか呼び出されません。しかし、デストラクタが4回呼び出されるのが分かります。これの理由は何ですか?デストラクタについての私の理解に関して何らかの誤りがありますか
私は 'delete p4'が正しいとは思わない。 – cnicutar
スタックに割り当てられているので 'p1'を' delete 'するべきではありません。 – ObscureRobot
すべてのメソッドを削除した場合、デストラクタ、フィールド、およびそれらのメソッドを呼び出す 'main()'のコードを削除すると、サンプルが大幅に短縮される可能性があります。彼らはあなたの質問には関係ありません。 – ObscureRobot