已删除的堆分配项评估为true

时间:2012-10-30 15:24:25

标签: c++ delete-operator

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,使用此方法删除无效?

2 个答案:

答案 0 :(得分:3)

当您访问已删除的对象时,行为未定义。任何事情都可能发生。

编辑:而且,更重要的是,当您删除未使用new创建的对象时,行为未定义。任何事情都可能发生。这就是这里的代码。

答案 1 :(得分:1)

您永远不会有指向 分配的对象的引用或指针。向量将生成对象的副本,但您已经丢失了原始对象本身的所有轨迹,因此无法恢复或删除它。

您需要执行以下操作之一:

T * p = new T;
delete p;

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

不要使用第二个版本。