Почему автор использовал reinterpret_cast? - PullRequest
0 голосов
/ 31 мая 2018

Вот фрагмент кода 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?

1 Ответ

0 голосов
/ 31 мая 2018

Почему автор использовал reinterpret_cast вместо static_cast?

static_cast мог преобразовать тип указателя в void* и преобразовать его обратно, но он не можетконвертировать между указателями на несвязанные типы.reinterpret_cast может.

5) Любой указатель на объект типа T1 может быть преобразован в указатель на объект другого типа cv T2.Это в точности эквивалентно static_cast<cv T2*>(static_cast<cv void*>(expression)) (что означает, что если требование выравнивания T2 не является более строгим, чем значение T1, значение указателя не изменяется, и преобразование полученного указателя обратно в его исходный тип приводит к исходному значению).В любом случае результирующий указатель может быть безопасно разыменован, только если это разрешено правилами псевдонимов типов (см. Ниже)

...