Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вызов метода класса для участка памяти вручную C++

123 123 Ученик (96), на голосовании 1 неделю назад
Из теоретического интереса пытаюсь проинициализировать экземпляр класса, работая напрямую с байтами:

 #include <iostream> 

class Test
{
public:
int size;
int* arr;
void create_array()
{
arr = new int[size];
}
};

int main()
{
void* malloc_test = malloc(sizeof(Test));
// Выделяю память размером Test, 16 байт

*(int*)malloc_test = 10;
// Меняю первые 4 байта на 10, это переменная size
// Следующие 4 байта - паддинг из за выравнивания
// Следующие 8 байт - указатель на int

Test* casted_test = reinterpret_cast<Test*>(malloc_test);
std::cout << casted_test->size;
// Тестирование в КОНЦЕ, size действительно равен 10

return 0;
}

Теперь хочу вызвать Test::create_array для этого участка памяти.
Это по идеи можно было бы сделать вот так:
 (reinterpret_cast<Test*>(malloc_test)->*create_array_ptr)(); 
Но суть в том, что я не хочу ничего кастить к Test*, кроме как в конце и то, просто чтобы протестировать.

Сложность в том, что create_array не статический метод, поэтому передает параметр this.

По идеи если бы я знал, в какой конкретно участок передается параметр this я бы мог вручную изменить его. Но тут два вопроса:
1. Как это узнать?
2. Как это реализовать? Потому что даже reinterpret_cast не хочет кастить таким образом:
 void* create_array_test = reinterpret_cast<void*>(&Test::create_array); 
Буду рад любой помощи.
Дополнен 1 месяц назад
Через бит каст все таки можно скопировать адрес метода, таким образом не кастить к Test.
Голосование за лучший ответ
Panic Doctor Просветленный (44113) 1 месяц назад
 (reinterpret_cast<Test*>(malloc_test)->*&Test::create_array)(); 
работает


либо так
 void (Test::*create_array_ptr)() = &Test::create_array; 
(casted_test->*create_array_ptr)();
123 123Ученик (96) 1 месяц назад
Перечитай вопрос:
"Но суть в том, что я не хочу ничего кастить к Test*, кроме как в конце и то, просто чтобы протестировать"
У тебя решение через каст к Test*
Panic Doctor Просветленный (44113) 123 123, ну а по void обращаться не даст компилятор и все равно где-то придется кастовать
Похожие вопросы