Нарушение прав доступа при удалении при использовании указателя и shared_pointer - PullRequest
0 голосов
/ 27 января 2012

У меня довольно большое устаревшее приложение, которое использует только обычные указатели.Прямо сейчас я добавляю новый модуль, пытаясь использовать «более современные вещи», например, умные указатели.

Основной модуль отправляет сообщение через коммуникационную DLL в мой новый подмодуль (с обычным указателем).В моем новом подмодуле я использую shared_pointer для обработки сообщений.Когда общий указатель пытается удалить указатель, я получаю нарушение прав доступа в dectructor сообщения, потому что указатель VTable равен 0xdddddddd.Я уже нашел этот вопрос SO , который говорит, что это потому, что указатель уже освобожден.

Кажется, что основной модуль уже удаляет нормальный указатель, прежде чем разделяемый указатель удаляет его.

Я не хочу использовать общие указатели в старом главном модуле (было бы очень много рефакторинга на этом этапе), но есть ли решение, как я могу использовать как обычные, так и общие указатели в моем приложении?Обычная проверка NULL в деструкторе не помогает.

1 Ответ

1 голос
/ 27 января 2012

Необходимо убедиться, что основной модуль передает владение указателем.
, т. Е. Он не должен поддерживать указатель на этот адрес после его отправки в ваш модуль.В противном случае он может освободить указатель, оставляя ваш модуль с висящим указателем.

Итак, если основной модуль поддерживает ссылки на указатель, то использование shard_ptr только для вашего модуля не имеет смысла.В этом случае вам также нужно будет использовать shared_ptr в основном модуле.

Также вам необходимо убедиться, что вы используете соответствующую подпрограмму освобождения памяти для указателя в shared_ptr::deleter().
Это может быть случай несоответствия в процедурах выделения и освобождения, используемых для указателя.

...