Понимание reinterpret_cast - PullRequest
3 голосов
/ 04 июля 2019

Следующая программа работает без каких-либо проблем, хотя памяти, выделенной классом B, недостаточно для размещения всех членов класса A.

// CPP code to illustrate the pointer reinterpret
#include <iostream>
using namespace std;

class A {
public:
    void fun_a()
    {
        cout << " In class A\n";
    }
    int Val;
    int Res;
};

class B {

};

int main()
{
    // creating object of class B
    B* x = new B();

    A* new_a = reinterpret_cast<A*>(x);

    // accessing the function of class A
    new_a->fun_a();
    new_a->Val = 10;
    new_a->Res = 20;

    cout << new_a->Val;
    cout << new_a->Res;

    return 0;
}

Ответы [ 3 ]

5 голосов
/ 04 июля 2019

Обращение через указатель на T, который не указывает на объект типа T (или совместимого типа), приводит к неопределенному поведению.

Следующая программа работает без проблем,

Программа, которая запускается без проблем, является примером неопределенного поведения.

1 голос
/ 04 июля 2019

Ваш код вызывает Неопределенное поведение (UB), что означает, что он может работать, как вы ожидали (например, на вашем компьютере, сегодня), но не равен гарантировано.

Вы правы в том, что этот код неверен, и вам просто (не) повезло, что он "работал на вашем компьютере"!

0 голосов
/ 05 июля 2019

Это неопределенное поведение.Мы должны использовать reinterpret_cast, когда мы знаем, что это безопасно.Например, вы хотите отправить объект с помощью программирования сокетов.Там Api будет принимать данные как символьный буфер, поэтому вы можете использовать его как A * new_a = new A ();char * new_Data = reinterpret_cast (new_a);На приемном конце вы должны использовать операцию инвертирования с использованием reinterpret_cast, но на этот раз от char * до A *;Это один из сценариев, когда вы знаете, что это безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...