Этот вопрос основан на некотором существующем 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
между двумя обращениями, я не верю, что это изменяет что-либо, поскольку оно не касается затронутой памяти и может повторно использовать одни и те же данные.
Является ли мой код сломанным или он "правильный"?