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;

不要使用第二个版本。

于 2012-10-30T15:49:00.040 回答