Начало работы с интеллектуальными указателями в C ++

У меня есть приложение на C ++, которое широко использует указатели для поддержки довольно сложных структур данных. Приложение выполняет математическое моделирование огромных наборов данных (для чего может потребоваться несколько ГБ памяти) и компилируется с использованием Microsoft Visual Studio 2010.

Сейчас я переделываю важную часть приложения. Чтобы уменьшить количество ошибок (висячие указатели, утечки памяти, ...), я бы хотел начать использовать интеллектуальные указатели. Жертвовать памятью или производительностью допустимо, пока она ограничена.

На практике большинство классов поддерживается в больших пулах (один пул на класс), и хотя классы могут ссылаться друг на друга, вы можете рассматривать пул как владельца всех экземпляров этого класса. Однако, если пул решит удалить экземпляр, я не хочу, чтобы какой-либо из других классов, которые все еще ссылаются на удаленный экземпляр, имел висящий указатель.

В другой части я храню коллекцию указателей на экземпляры, которые доставляются другими модулями в приложении. На практике другие модули сохраняют владение переданным экземпляром, но в некоторых случаях модули не хотят заботиться о владении и просто хотят передать экземпляр в коллекцию, говоря ему: «Теперь он ваш, управляйте им».

Как лучше всего начать внедрять интеллектуальные указатели? Простая замена указателей [наугад] интеллектуальными указателями не кажется правильным способом и, вероятно, не обеспечивает всех (или каких-либо) преимуществ интеллектуальных указателей. Но какой метод лучше?

Какие типы интеллектуальных указателей мне следует изучить дальше? Я иногда использую std :: auto_ptr для освобождения локально выделенной памяти, но, похоже, это не исправлено в C ++ 0x. Это std :: unique_ptr лучшая альтернатива? Или мне следует сразу перейти к общим указателям или другим типам интеллектуальных указателей?

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

Заранее благодарим за ваши идеи и предложения.

6
задан Community 23 May 2017 в 12:11
поделиться