24

次のコード スニペットを見つけました。

#include <iostream>
#include <string>
using namespace std;
class First
{
    string *s;
    public:
    First() { s = new string("Text");}
    ~First() { delete s;}
    void Print(){ cout<<*s;}
};

int main()
{
    First FirstObject;
    FirstObject.Print();
    FirstObject.~First();
}

テキストには、このスニペットは実行時エラーを引き起こすはずであると書かれていました。よくわからなかったので、コンパイルして実行してみました。出来た。奇妙なことに、関連するデータが単純であるにもかかわらず、プログラムは「テキスト」を出力した後、1 秒後にのみ途切れてしまいました。

そのようなデストラクタを明示的に呼び出すことが合法であるかどうかわからなかったので、デストラクタに出力される文字列を追加しました。プログラムは文字列を 2 回出力しました。したがって、通常のプログラムの終了は明示的な呼び出しを認識せず、オブジェクトを再度破棄しようとするため、デストラクタが 2 回呼び出されると推測しました。

自動化されたオブジェクトでデストラクタを明示的に呼び出すことは危険であることが簡単な検索で確認されました。これは、2 回目の呼び出し (オブジェクトがスコープ外に出たとき) の動作が未定義であるためです。したがって、コンパイラ (VS 2017) またはこの特定のプログラムで幸運でした。

実行時エラーに関するテキストは単に間違っていますか? それとも、実行時エラーが発生するのは本当に一般的ですか? それとも、私のコンパイラは、この種のものに対して何らかのウォーディングメカニズムを実装したのでしょうか?

4

3 に答える 3