удаление указателя объекта с помощью двух указателей - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть объект сказать.

ClassA *obj1 = new ClassA;

ClassA *ptr1 = obj1;
ClassA *ptr2 = obj1;

Когда я сделаю delete ptr1;, это повлияет на ptr2? Если так, что может быть правильным решением для этого?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

(при условии, что obj2 должно быть obj1)

ClassA *x определяет указатель , который может указывать на объекты типа ClassA. Указатель не сам объект.

new ClassA выделяет (и создает) фактический объект типа ClassA.

Таким образом, строка Class A *obj1 = new ClassA; определяет указатель obj1, а затем устанавливает его так, чтобы он указывал на вновь выделенный объект типа ClassA.

Строка Class A *ptr1 = obj1; определяет указатель ptr1, а затем устанавливает его так, чтобы он указывал на то же самое, на что obj1 указывает, то есть на объект ClassA, который мы только что создали.

После строки Class A *ptr2 = obj1; у нас есть три указателя (obj1, ptr1, ptr2), все они указывают на один и тот же объект.

Если мы сделаем delete ptr1; (или, что эквивалентно, delete obj1; или delete ptr2;), мы уничтожим указанный объект. После этого любой указатель, указывающий на объект, становится недействительным (что отвечает на ваш первый вопрос: да, это повлияет на ptr2 в том смысле, что ptr2 впоследствии не будет указывать на действительный объект).

Правильное решение зависит от того, чего вы пытаетесь достичь:

  • Если вам нужны две копии объекта, предполагая, что ClassA имеет конструктор копирования, выполните ClassA *ptr2 = new ClassA(*obj1);. Вам нужно будет delete этот новый объект отдельно, когда вы закончите с ним!
  • Если вам нужны два указателя на один и тот же объект, рассмотрите возможность использования что-то вроде boost::shared_ptr (Google google)

Хм, это много текста для такого простого q + a. Ах, хорошо.

1 голос
/ 23 сентября 2010

Если предположить, что obj2 должно быть obj1, тогда да, вызов delete на ptr1 оставит ptr2 с неверными данными.Решением этой проблемы было бы установить ptr1 на NULL, если вы хотите очистить его, не теряя объект, на который указывает ptr2.

Удалить, это просто для случая, когда вы хотите полностью освободитьобъем памяти.Если вы все еще хотите сохранить объект и данные, на которые он указывает, но хотите очистить указатель, установите для него значение NULL (или (void *) 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...