2015-05-25 4 views
0

ДопустимC++ Удаление указатель на объект, который содержит другой указатель

class A { 
    A* array; 
public: 
    A(){ 
    array= new A [4]; 
    } 

    ~A(){ 
    delete array; 
    } 
} 

Как мы освобождаем объект, если мы создаем такой объект на куче, как

A* object_ptr =new A(); 

Я немного путают о том, чтобы освободить указатель, указывающий на объект, содержащий другой указатель .....

ответ

0

Две вещи отметить.

  1. При удалении массивов вы должны использовать []. Например: delete [] array;
  2. При удалении указателей деструктора выделенного объекта будет вызван. Вы должны были бы позвонить из своего кода: delete object_ptr;, чтобы удалить указатель.

Еще один важный момент, который следует знать о том, что происходит, когда вы копируете свой объект. Если ваш объект когда-либо получает копии, у вас будут проблемы, когда один деструктор удаляет указатели из-под другого объекта. Поэтому shared_ptr является хорошей альтернативой для сырых указателей (см this question о том, как использовать shared_ptr).

+0

Если я назначу object_ptr новому указателю, это вызовет такую ​​же проблему? – GalaxyVintage

+0

Да. Если вы пишете: 'A * a = new A(); A * b = a; delete a; 'и' '' '' '' '' '' '' '' будет также удален. –

+0

Hmm..also если объект создается с помощью метода в стек с одним из его полей, создаваемых в куче, это память в куче получить освобожден после? – GalaxyVintage

0

Деструктор будет вызываться, когда вы будете delete вашего объекта, и это все, о чем вам нужно беспокоиться. Более подробную информацию здесь: Does delete call the destructor?

5

Вызов

delete object_ptr; 

после

A* object_ptr =new A(); 

будет вызывать деструктор A указывает object_ptr. Это означает, что если вы исправить вашу неправду

~A(){ 
    delete array; 
} 

в

~A(){ 
    delete[] array; 
} 

ваш код будет хорошо, и внутренний указатель правильно освобожден.

Кстати, вы действительно должны использовать std::vector вместо new[]. Это сделает вашу жизнь намного проще. Если вы настаиваете на new[], читайте о The Rule of Three.

+0

и 'станд :: unique_ptr' (если таковые имеются) вместо«чистых»указателей – Hcorg

+0

@Hcorg Лично я никогда не столкнулся с проблемой, когда член указатель был хорошей идеей. но, как правило, * «Нет владения исходными указателями» * - хороший совет, конечно. –

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