Как избежать удаления выделенной памяти дважды? - PullRequest
1 голос
/ 23 августа 2010

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

object2 = object1;

и деструктор явно удалит динамически размещенный объект. Поэтому, когда object2 и object1 выходят из области видимости, происходит ошибка (я предполагаю, что это потому, что адрес для динамически размещаемого объекта удаляется дважды). Итак, что я должен сделать, чтобы исправить / избежать этой проблемы?

Ответы [ 2 ]

0 голосов
/ 08 мая 2011

Вы не можете избежать этого, потому что вы скопировали все биты object1 в object2, там будет два указателя на одно место, но деструктор будет вызван дважды, потому что есть два объекта.

Первое решениепредотвратит вызов деструктора object2:

char object2_data[sizeof(object1)];
Type* object2 = (Type*) object2_data;
*object2 = object1;
...
object1.do_something();
object2->do_something(); //However, the pointer is different

Второй способ - изменить дизайн объекта и добавить переменную bool, которая сообщит, является ли объект копией.Когда объект удаляется, если это копия, не удаляйте указатель.Наконец, реализуйте конструктор копирования и перегрузите operator =, чтобы скопировать объект, и установите переменную bool, чтобы сообщить, что это копия.Однако, если исходный объект будет удален, копии не будут использоваться, поскольку они будут иметь недопустимые указатели.

0 голосов
/ 23 августа 2010

Я предполагаю, что это C ++?В этом случае взгляните на умные указатели .Подсчет ссылок (boost :: shared_ptr) помогает решить эту проблему.

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