Я перечисляю шаги/проблемы, связанные с этим. Они работали на меня, но я не могу ручаться, что они на 100% правильны.
0) проверьте, могут ли быть циклические общие указатели. Если это так, может ли это привести к утечке памяти? В моем случае, к счастью, циклы не должны быть разбиты, потому что, если бы у меня был цикл, объекты в цикле были бы полезны и не должны быть уничтожены. использовать слабые указатели для размыкания циклов
1) вам необходимо заменить «most» на shared_ptr<X>
. Shared_ptr (только?) Создается сразу после каждого динамического распределения X. Во всяком случае, это копия, построенная или построенная с пустым указателем (для сигнала NULL). Чтобы быть в безопасности (но немного неэффективно), передайте эти shared_ptrs только по ссылке. В любом случае, вероятно, вы никогда не передавали свои указатели со ссылкой, чтобы начать с => никаких дополнительных изменений не требуется
2) Возможно, вы использовали dynamic_cast<X*>(y)
в некоторых местах. замените это на dynamic_pointer_cast<X>(y)
3) где бы вы ни проходили NULL
(например, чтобы сигнализировать об отказе вычисления), передайте пустой общий указатель.
4) удалить все ВЕЬЕТЕ для соответствующих типов
5) сделать свой базовый класс B наследует от enable_shared_from_this<B>
. Затем, где бы вы ни проходили this
, перейдите, shared_from_this()
. Возможно, вам придется выполнять статическое кастинг, если функция ожидает производного типа. имейте в виду, что, когда вы звоните shared_from_this()
, некоторые shared_ptr
должны иметь права this
. В частности, не вызывайте shared_from_this()
в конструкторе класса
Я уверен, что можно полуавтоматизировать этот процесс, чтобы получить семантически эквивалентный, но не обязательно очень эффективный код. Программисту, вероятно, нужно только рассуждать о циклической ссылке (если таковая имеется).
Во многих из этих шагов я многократно использовал regexes. Это заняло около 3-4 часов. Код компилируется и выполнялся правильно до сих пор.
Существует так размещаете на это: http://stackoverflow.com/questions/8334886/c11-smart- указатели-политики, которые проходят через различные типы интеллектуальных ptr и релевантность для C++ 11, если это вас интересует – EdChum
Если у вас так много указателей, вы можете пересмотреть свой стиль кодирования, чтобы увидеть, будут ли автоматические объекты не более подходящее. Иногда люди используют динамическое распределение гораздо больше, чем должны. –
@KerrekSB: Указатели! = Динамическое распределение. Вы можете использовать много указателей, не называя никаких новых или удаленных. – SigTerm