boost :: unsafe_any_cast неверный ненулевой указатель, когда пуст? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть фрагмент кода, в котором я использую boost::unsafe_any_cast<void*>(&boost::any anyInstance) для получения указателя содержимого объекта boost::any. Код это ниже:

boost::any staticResult;  //contains a private pointer called content
f(staticResult);          //makes the content pointer a null pointer 
void* voidStaticResult = boost::unsafe_any_cast<void*>(&staticResult);

К сожалению, при отладке я вижу, что указатель содержимого в staticResult равен NULL (0x00000000), а voidStaticResult - 0x00000004.

(Видимо, для этого нет причин. У вас есть идеи?)

EDIT: функция f () вызывает dll, создающую экземпляр объекта. Экземпляр указывается указателем содержимого staticResult. Мне нужно передать указатель на другую функцию, но мне кажется, что нет простого способа «привести» boost :: any к указателю на экземпляр класса. Любое другое решение было бы замечательно.

1 Ответ

0 голосов
/ 26 июня 2018

Вероятно, небезопасный любой бросок действителен только для непустых любых. Это небезопасно и не проверено.

Любой часто реализуется как указатель на блок памяти, где за виртуальной таблицей следует экземпляр объекта. Таким образом, чтобы получить указатель на объект, вы добавляете sizeof (vtable ptr) к любому внутреннему указателю, 4 в вашей сборке.

...