Бьерн Страуструп.
Язык программирования С++
143
table
t1(100);
table t2 = t1; // неприятность
table
t3(200);
t3 = t2; // неприятность
}
В этом примере конструктор table вызывается дважды: для t1 и t3. Он не вызывается для t2, поскольку
этот объект инициализируется присваиванием. Тем не менее, деструктор для table вызывается три
раза: для t1, t2 и t3! Далее, стандартная интерпретация присваивания - это копирование по членам,
поэтому перед выходом из h() t1, t2 и t3 будут содержать указатель на массив имен, память для
которого была выделена в свободной памяти при создании t1. Указатель на память, выделенную для
массива имен при создании t3, будет потерян. Этих неприятностей можно избежать (см. $$1.4.2 и
$$7.6).
Достарыңызбен бөлісу: