为什么作者使用reinterpret_cast?

时间:2018-05-31 01:35:47

标签: c++ casting type-conversion

以下是Effective C ++ Item 50的代码片段:

static const int signature = 0xDEADBEEF;

typedef unsigned char Byte;

// this code has several flaws — see below
void* operator new(std::size_t size) throw(std::bad_alloc)
{
    using namespace std;
    size_t realSize = size + 2 * sizeof(int); // increase size of request so 2
    // signatures will also fit inside
    void *pMem = malloc(realSize); // call malloc to get the actual
    if (!pMem) throw bad_alloc(); // memory

    // write signature into first and last parts of the memory
    *(static_cast<int*>(pMem)) = signature; 
    *(reinterpret_cast<int*>(static_cast<Byte*>(pMem)+realSize-sizeof(int))) = signature;
    // return a pointer to the memory just past the first signature
    return static_cast<Byte*>(pMem) + sizeof(int);

}

为什么作者使用reinterpret_cast代替static_cast?我可以仅使用reinterpret_caststatic_cast

替换所有四个演员

1 个答案:

答案 0 :(得分:3)

  

作者为何使用reinterpret_cast代替static_cast

static_cast可以将指针类型转换为void*并将其转换回来,但它无法在指向不相关类型的指针之间进行转换。 reinterpret_cast可以。

  

5)任何指向T1类型对象的指针都可以转换为指针   另一种类型的对象cv T2。这完全等同于   static_cast<cv T2*>(static_cast<cv void*>(expression))(暗示   如果T2的对齐要求不比T1更严格,那么   指针的值不会改变和转换结果   指针返回其原始类型会产生原始值)。在任何   如果允许,结果指针只能安全地解除引用   按类型别名规则(见下文)