я не могу решить следующую проблему самостоятельно:Когда мы начинаем перезаписывать память, срок службы объекта закончился?
Предположим, что мы повторно использовать память в следующем виде:
struct A
{
int a;
A(){ }
~A(){ }
};
struct B : A
{
int b;
B(){ }
~B(){ }
};
A *a = (A*) malloc(sizeof(A) + sizeof(B));
B *b = new (a) B; //Constructor of B is calling
Время жизни объекта обозначаемого к по a
закончилась перед конструктором B
начинает позвонить или он закончился, когда закончил конструктор B
?
@RSahu _ Срок службы объекта, который указывает, что точки не заканчиваются до тех пор, пока вы не назовете delete a; _ Это не совсем так. Поскольку 3.8 сказал, что время жизни объекта типа T заканчивается, если T - тип класса с нетривиальным деструктором (12.4), начинается вызов деструктора или память, которую объект занимает, повторно используется или освобождается. –
@ St.Antario: Что вы пытаетесь сделать, выполнив это? Прежде всего, 'new A' гарантированно выделяет достаточно памяти для хранения экземпляра' A', а не экземпляра 'B'. Размещение нового (что является «новым (a) B') не выполняет распределение памяти; он просто создает 'B', где указывает' a'. У вас есть неопределенное поведение и отнюдь не гарантировано работать. –
@ Insilico Я понимаю, что это UB. Но я пытаюсь узнать _details_ и найти официальное объяснение с использованием Стандарта. –