A *ob1 = new A();
LL *ob2 = new LL();
this->Handle(&ob1, &ob2);
ob1
и ob2
уже являются указателями. Взяв адреса переменных (соответственно типов A**
и LL**
), затем передав их в Handle
, где они вбиваются в A*
и LL*
с reinterpret_cast
с, а затем записываются в , код вызывает неопределенное поведение. В этом конкретном случае он, кажется, записывает в местоположения рядом с переменными ob1
и ob2
, которые, вероятно, находятся в кадре стека вызова Set
.
Если вместо обработки системы типов с помощью reinterpret_cast
код использовал ее правильно, компилятор сразу же обнаружил бы ошибку:
void Handle(A *arg1, LL *arg2)
{
ob1->c = 'c';
ob1->v = (void*)0xffffffff;
ob2->n = 0xff;
ob2->next = new LL();
ob2->prev = 0;
}
// ...
// the compiler would complain about this call making the problem clear
this->Handle(&ob1, &ob2);
Было бы еще лучше, если бы код не использовал так много указателей повсюду, но я собираюсь предположить, что это был просто кусок кода, чтобы продемонстрировать проблему.