2015-04-22 7 views
0

Это если есть объект, позволяет назвать его o, и два массива typeo *a,*b; если я назначу o для обоих массивов a и массива b тогда delete[] b что произойдет, если я пытаюсь получить доступ к O или O в? Например:Deallocating элемент в массиве

struct name{int a;} 
name *a = new name[1]; 
name *b = new name[1]; 
name o; 
a[0] = o; 
b[0] = o; 
delete[] b; 
a[0]; // what happens here? 

ответ

1

В примере нет проблем. a[0] и b[0] - разные объекты в разных местах памяти, а уничтожение одного из них не влияет на другое.

new - это красная сельдь; следующий код работает точно так же:

name o; 
name a = o; 
{ 
    name b = o; 
} 

a; 

name имеет семантику значений, то есть, копируя его по значению создает совершенно отличную копию. Встроенные типы, такие как int, также имеют значение-семантику.

Этот код будет работать только в случае, если o не имеет семантики значений; например, если он содержит дескриптор ресурса и не содержит код-конструктор и код-оператор-оператор для дублирования дескриптора ресурса.

Тогда копирование o создало бы два объекта с одним и тем же дескриптором на этом ресурсе, и если деструктор o освободит ресурс, он оставит свисающую копию.

Чтобы избежать этих проблем, обычно рекомендуется создавать все классы для семантики значений. Если класс имеет дескриптор ресурса, который не дублируется, тогда класс должен отключить свой экземпляр-конструктор и оператор присваивания для предотвращения непреднамеренных копий. Фактически, дескриптор ресурса должен храниться классом, предназначенным для ручек ресурсов.

Это иногда называют «правилом трех» (или с C++ 11, «правило пять» или «правило нуля»).

2

Если вы просто определить Int a[1] вы не выделять память в куче, поэтому нет необходимости удалять.

В противном случае, если вы создаете массив следующим образом: int *a= new int[1], вы должны удалить, как delete [] a;

Рассматривая оба вышеуказанных сценариев, вы можете безопасно получить доступ к `а» после удаления б, если вы распределенную память для b и a.

+0

Я отредактирую и добавлю более точный код, это близко к тому, что я ищу, но не совсем. – Hovestar

 Смежные вопросы

  • Нет связанных вопросов^_^