В примере нет проблем. a[0]
и b[0]
- разные объекты в разных местах памяти, а уничтожение одного из них не влияет на другое.
new
- это красная сельдь; следующий код работает точно так же:
name o;
name a = o;
{
name b = o;
}
a;
name
имеет семантику значений, то есть, копируя его по значению создает совершенно отличную копию. Встроенные типы, такие как int
, также имеют значение-семантику.
Этот код будет работать только в случае, если o
не имеет семантики значений; например, если он содержит дескриптор ресурса и не содержит код-конструктор и код-оператор-оператор для дублирования дескриптора ресурса.
Тогда копирование o
создало бы два объекта с одним и тем же дескриптором на этом ресурсе, и если деструктор o
освободит ресурс, он оставит свисающую копию.
Чтобы избежать этих проблем, обычно рекомендуется создавать все классы для семантики значений. Если класс имеет дескриптор ресурса, который не дублируется, тогда класс должен отключить свой экземпляр-конструктор и оператор присваивания для предотвращения непреднамеренных копий. Фактически, дескриптор ресурса должен храниться классом, предназначенным для ручек ресурсов.
Это иногда называют «правилом трех» (или с C++ 11, «правило пять» или «правило нуля»).
Я отредактирую и добавлю более точный код, это близко к тому, что я ищу, но не совсем. – Hovestar