Std :: malloc () и начало жизни объектаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std :: malloc () и начало жизни объекта

Сообщение Anonymous »

Выдержка из книги «C ++ Управление памятью» от Patrice Roy < /p>

функция std :: memcpy () < /h4>
Для исторической (и c совместимости) причинам), std :: memcpy () < /code> является специальным
, как это может начать сжима, если используется объект.
Неверное использование std :: memcpy () для типа карат будет следующим образом: < /p>

Код: Выделить всё

// suppose this holds for this example
static_assert(sizeof(int) == sizeof(float));
#include 
#include 
#include 
int main() {
   float f = 1.5f;
    void *p = malloc(sizeof f);
    assert(p);
    int *q = std::memcpy(p, &f, sizeof f);
    int value = *q; // UB
    //
}
< /code>
Причина, по которой это незаконно, заключается в том, что призыв к std :: memcpy ()
копирует плавающий объект в хранилище, на которое указывает P, эффективно
, запускаю время жизни плавающего объекта в этом хранилище. Поскольку Q - это
int*, dereferencing, это ub. < /P>
< /blockquote>
Это действительно ub здесь? Не malloc () 
неявно создает int (if sizeof (int) == sizeof (float) , конечно), и мы можем юридически сделать memcpy и чем прочитать его значение.


Подробнее здесь: https://stackoverflow.com/questions/796 ... the-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»