1. ホーム
  2. c++

[解決済み] クラスのデストラクタを呼び出すにはどうしたらいいですか?

2022-03-03 07:01:12

質問

簡単なC++のコードがあるのですが、デストラクタの使い方がわかりません。

class date {

public:
    int day;
    date(int m)
    {
        day =m;
    }

    ~date(){
    cout << "I wish you have entered the year \n" << day;    
    }
};


int main()
{
  date ob2(12);
  ob2.~date();
  cout << ob2.day;
  return 0;
}

という疑問があります。 デストラクタのコードにどう書けば、デストラクタを呼び出した後、そのコードに含まれる day 変数 ?

解決方法は?

デストラクタを明示的に呼び出すべきではありません。

スタック上にオブジェクトを作成する場合(あなたがしたように)必要なのは

int main()
{
  date ob2(12);
  // ob2.day holds 12
  return 0; // ob2's destructor will get called here, after which it's memory is freed
}

ヒープ上にオブジェクトを作成するとき、ちょっとだけ必要なのは delete のデストラクタが呼ばれ、メモリが解放される前に、あなたのクラスを削除してください。

int main()
{
  date* ob2 = new date(12);
  // ob2->day holds 12
  delete ob2; // ob2's destructor will get called here, after which it's memory is freed
  return 0;   // ob2 is invalid at this point.
}

(この最後の例でdeleteを呼ばないと、メモリ不足になります)。

どちらの方法にも利点と欠点があります。スタック方式はオブジェクトが占有するメモリの確保が非常に速く、明示的に削除する必要はありませんが、スタックのスペースは限られており、オブジェクトを簡単に、速く、きれいに移動させることはできません。

ヒープは好ましい方法ですが、パフォーマンスに関して言えば、割り当てに時間がかかり、ポインターを扱わなければなりません。しかし、オブジェクトをどうするかについては、より柔軟性があり、ポインターをさらに扱う方がはるかに速く、オブジェクトのライフタイムをよりコントロールすることができるのです。