объекты memcpy not-POD приводят к неопределенному поведению

В какой ситуации объект Class будет гарантировать вставку invisible data в объект?

Люди обычно говорят, что это не нормально при использовании memcpy копировать объекты вместо copy-assignmentиногда компилятор вставляет невидимые данные в объекты. так после memcpy может быть разбита память объекта.

Если он содержит вирусную функцию, то это не POD.
Но содержит виртуальные, функция может не аварийно завершить работу, она не определена.
Может кто-нибудь привести мне пример того, что memcpy, безусловно, не так.

Некоторые люди говорили, что shared_ptr аффект memcpyЯ пытался, но не вылетает

может кто-нибудь написать тестовую демонстрацию, чтобы доказать это?

-2

Решение

shared_ptr хороший пример: копирование представления объекта даст вам второй указатель на тот же объект, но без увеличения счетчика использования. После того, как вы нарушили инвариант, что счетчик использования должен равняться количеству указателей, вы оставляете себя открытым для неопределенного поведения, такого как разыменование висячих указателей и удаление одного и того же объекта дважды:

shared_ptr<int> good(new int(42));
shared_ptr<int> evil;

memcpy(&evil, &good, sizeof evil); // Breaking invariant
good.reset();                      // Deletes object

*evil = 666;                       // BOOM! accesses deleted object
evil.reset();                      // BOOM! deletes object a second time.

Вы также упоминаете виртуальные функции. Это может вызвать проблемы, если вы скопируете базовый подобъект производного класса; результирующий объект (вероятно) будет указывать на виртуальную таблицу для неправильного класса:

struct Base {
virtual int f() {return 0;}
};

struct Derived : Base {
int x;
virtual int f() {return x;}
};

Base * good = new Derived;
Base evil;

memcpy(*evil, good, sizeof evil); // Base object with Derived vtable (probably)

evil->f(); // BOOM! probably accesses nonexistent member `x`
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]