Этот вопрос основан на некотором существующем C-коде, перенесенном на С++. Меня просто интересует, является ли это "безопасным". Я уже знаю, что я бы не написал это так. Я знаю, что код здесь в основном C, а не С++, но он скомпилирован с компилятором С++, и я знаю, что стандарты иногда немного отличаются.
У меня есть функция, которая выделяет некоторую память. Я передал возвращенный void* в int* и начал использовать его.
Позже я вернул возвращаемый void* в Data* и начал использовать его.
Является ли это безопасным в С++?
Пример: -
void* data = malloc(10000);
int* data_i = (int*)data;
*data_i = 123;
printf("%d\n", *data_i);
Data* data_d = (Data*)data;
data_d->value = 456;
printf("%d\n", data_d->value);
Я никогда не читал переменные, используемые другим типом, чем они были сохранены, но беспокоиться о том, что компилятор может видеть, что data_i и data_d являются разными типами и поэтому не могут юридически псевдонимы друг друга и решают изменить порядок моего кода, например поместив хранилище в data_d до первого printf. Что сломает все.
Однако это шаблон, который используется все время. Если вы вставляете free и malloc между двумя обращениями, я не верю, что это изменяет что-либо, поскольку оно не касается затронутой памяти и может повторно использовать одни и те же данные.
Является ли мой код сломанным или он "правильный"?