在铸造到空隙*和从空间返回时,混合静态和重新解释铸造是不安全的吗?

时间:2013-05-11 17:10:36

标签: c++ casting reinterpret-cast

简单地说:如果我static_cast类型为X*void*reinterpret_cast它回到X *是否总是安全的?

我无法产生任何失败的情况,例如:

#include <iostream>

struct a
{
    int* m_array;
};

int main()
{
    bool fail = false;

    for(int i = 0; ++i < 5000;)
    {
        a* pA = new a;
        pA->m_array = new int [i+1]; // A new size of data everytime
        pA->m_array[i] = 10;

        void* pvA = static_cast<void*>(pA);
        pA = reinterpret_cast<a*>(pvA);

        if(pA->m_array[i] != 10)
        {
            fail = true;
            break;
        }

        delete []pA->m_array;
        delete pA;
    }

        if(fail)
            std::cout<<"FAILED!!";
        else
            std::cout<<"Never failed :/";
}

Link to compiled example

使用vs 2012在调试和发布模式下给出结果“Never failed:/”。但是,这很可能是未定义的行为。正确?

1 个答案:

答案 0 :(得分:3)

定义明确。根据ISO / IEC 14882:2011 [expr.reinterpret.cast]§7(强调我的):

  

可以将对象指针显式转换为对象指针   不同的类型。当“指向T1的指针”类型的prvalue v是   转换为“指向 cv T2的指针”类型,结果是 static_cast&lt; cv   T2 *&gt;(static_cast&lt; cv void *&gt;(v))如果T1和T2都是标准布局   类型(3.9)和T2的对齐要求不比更严格   那些T1,或任何一种类型都是无效的。