Для программного задания нам дается шаблонный класс с двумя членами, объявленными не как указатели, а как реальные объекты:
Foo member;
В конструкторе я сначала попытался member = *(new Foo());
, но узнал, что,по крайней мере, иногда это копировало новый объект Foo и, следовательно, вызывало утечки памяти.
Я наконец обнаружил member = Foo()
, а затем посмотрел, в чем разница.Я узнал, что член будет размещен в стеке, а не в куче, и что он будет удален, как только выйдет из области видимости.Как это работает для объектов?
Член удаляется только при удалении родительского / класса объекта?
У меня также есть другой вопрос по поводу member = *(new Foo());
.Я инициализировал две переменные-члены одного типа:
// Members
Foo member1;
Foo member2;
// Constructor {
member1 = *(new Foo());
member2 = *(new Foo());
}
По какой-то причине казалось, что member1
не копируется, и он сохранил тот же адрес, что и исходный Foo
(т.е. не было памятиутечка когда была удалена).member2
однако, будет скопирован и имел другой адрес, и память просочилась.Есть ли объяснение этому?