В какой ситуации объект Class будет гарантировать вставку invisible data
в объект?
Люди обычно говорят, что это не нормально при использовании memcpy
копировать объекты вместо copy-assignment
иногда компилятор вставляет невидимые данные в объекты. так после memcpy
может быть разбита память объекта.
Если он содержит вирусную функцию, то это не POD.
Но содержит виртуальные, функция может не аварийно завершить работу, она не определена.
Может кто-нибудь привести мне пример того, что memcpy, безусловно, не так.
Некоторые люди говорили, что shared_ptr
аффект memcpy
Я пытался, но не вылетает
может кто-нибудь написать тестовую демонстрацию, чтобы доказать это?
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`
Других решений пока нет …