0
struct Set
{
    int a;
    Set() : a(30){};
    bool operator>( const Set& ref ) const
    {
        return ref.a > this->a;
    };
};

int _tmain(int argc, _TCHAR* argv[])
{   
    vector<Set>m_set;
    m_set.push_back( (*(new Set)) );
    cout << m_set.at(0).a;
    delete &(m_set.at(0));
    if( &(m_set.at(0).a) )
        cout << "valid" << endl;

    return 0;
}

なぜ出力validするのですか、このメソッドを使用した削除は無効ですか?

4

2 に答える 2

3

削除されたオブジェクトにアクセスすると、動作は未定義になります。何でも起れる。

編集:そして、もっと重要なことに、newで作成されていないオブジェクトを削除すると、動作は未定義になります。何でも起れる。それがここのコードが行うことです。

于 2012-10-30T15:26:40.413 に答える
1

割り当てたオブジェクトへの参照またはポインタはありません。ベクターはオブジェクトのコピーを作成しますが、元のオブジェクト自体のすべてのトラックを失ったため、オブジェクトを回復または削除する方法はありません。

次のいずれかを実行する必要があります。

T * p = new T;
delete p;

T & r = *new T;
delete &r;

2番目のバージョンは使用しないでください。

于 2012-10-30T15:49:00.040 に答える