1

C++ の次のコードに関連する 2 つの質問があります。

class Base
{
public:
    virtual bool deleteMe()
    { 
        delete this;
        return true;
    }
};

class Derived: public Base
{
public:
    void setBCO(const BigCustomObject& t_BCO)
    { m_BCO=t_BCO;}

    BigCustomObject m_BCO;
};


int main()
{
    Derived *pDerived = new Derived();

    //insertint the "BigCustomObject" by new or local copy makes no difference, or?
    //Because the "setBCO(){m_BCO=t_BCO;}" calls the copy operator anyway, or?
    pDerived->setBCO( ... );

    bool checkDel = pDerived->deleteMe();

    //bool checkDel = ((Base*)pDerived)->deleteMe(); //Does this make any difference?
    std::cout<<checkDel;
}

1.) deleteMe() 関数が自身のオブジェクトを削除した後に値を返す可能性があるのはどうしてですか?

2.) ベース オブジェクトのみを削除すると、派生オブジェクトの「BigCustomObject」はどうなりますか?

ありがとうございました。

4

3 に答える 3

6
  1. コードが実行されるオブジェクトは、thisポインター (および非修飾メンバー名の暗黙のコンテナー) として使用されます。実行コード自体とは関係がないため、実行は問題なく続行できます。ただし、削除後のdeleteMe()データ メンバーにアクセスしようとすると、問題が発生します。this

  2. あなたの場合、おそらくリークされています。技術的に言えば、コードには未定義の動作があるため、何が起こる可能性があります。その理由はBase、仮想デストラクタがないため、基本クラスへのポインターを介して派生オブジェクトを削除することは未定義です。Baseただし、仮想デストラクタがあれば問題なく動作します。 のデストラクタがDerived(仮想ディスパッチを介して) 呼び出され、次に のデストラクタが呼び出さBigCustomObjectれて破棄されm_BCO、次に のデストラクタが呼び出されBaseます。

于 2013-10-28T10:48:37.097 に答える
3

1) オブジェクトのメモリが自己破壊するからといって、コードは自己破壊しません。メンバー変数によって参照されるデータが無効になることを意味します。

2) Base には仮想デストラクタがないため、BigCustomObject が正しく破壊されないと思います。

于 2013-10-28T10:45:20.190 に答える