以下是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_cast
或static_cast
?
答案 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更严格,那么 指针的值不会改变和转换结果 指针返回其原始类型会产生原始值)。在任何 如果允许,结果指针只能安全地解除引用 按类型别名规则(见下文)