1

動的に割り当てられたオブジェクトへのポインターを使用してメンバー関数が呼び出された場合、オブジェクトは削除されます。しかし、メンバー関数が静的に割り当てられたオブジェクトを使用して呼び出された場合、どうなりますか?

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

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

    s->fun();
    sample s1;
    s1.fun();
}
4

3 に答える 3

3

メンバー関数内のポインターの削除は、そのポインターがどのように割り当てられているかを知っている限り問題ありません。ポインターだけからそれを知る移植可能な方法はありません。

動的に割り当てられていないポインターが関数に渡され、関数がdeleteそのポインターで呼び出す場合、それは未定義の動作です。さらに、配列として割り当てられた動的オブジェクトへのポインターでさえ、通常のdelete演算子では解放できませんdelete[]。それらに対して使用する必要があります。簡単なルールは、ポインターの起源がわからない場合は、それを呼び出さないというdeleteことです。

于 2015-05-12T12:06:08.703 に答える
2

deleteオブジェクトが を使用して割り当てられた場合にのみ使用できますnew。そのような単純な。したがって、あなたが示した最初の例は合法ですが、2 番目の例はそうではありません。2 番目のケースは、クラッシュする可能性が高く、さらに悪いことに、ヒープの破損を引き起こし、問題から遠く離れた場所の一見ランダムなメモリ割り当てでクラッシュします。

于 2015-05-12T12:46:37.740 に答える