Я в настоящее время пытаюсь зафиксировать несколько слабых мест в нашей кодовой базе путем представления использования интеллектуальных указателей. Кодовая база является очень большой, и связанная как паук, у которого был тот многим кофе.
Я задавался вопросом, попробовали ли люди прежде и каков их подход был.
Мой первый шаг был к классам определения типа, следующим образом.
#ifndef USE_SMART_POINTERS
#define USE_SMART_POINTERS 0
#endif
#if USE_SMART_POINTERS == 1
#include <boost/smart_ptr.hpp>
#endif
namespace ProductX
{
// forward decleration
class CTObject;
//typedefs
#if USE_SMART_POINTERS == 1
typedef boost::shared_ptr<CTObject> CTObjectPtr;
#else
typedef CTObject* CObjectPtr;
#endif
}
Теперь я понимаю, что это приведет к богатству областей компиляции, вещей как
CTObjectPtr i = NULL;
Будет completly Bork, когда интеллектуальные указатели будут включены.
Я задавался вопросом, было ли что-нибудь, что я мог бы сделать на этой ранней стадии для сокращения массы ошибок компиляции или являюсь ею, как я подозреваю, просто берут вещи на индивидуальной основе.
Богатые аплодисменты
Не делайте этого: я имею в виду определения типов.
Предположительно, в старом коде есть хотя бы несколько вызовов delete ? Что, безусловно, не сработает в случае умного указателя.
Умный указатель на определенные вещи или нет, то есть преследование определенного экземпляра через базу кода. Заставьте это работать, а затем двигайтесь дальше. Удачи!
Вместо того, чтобы пытаться внедрить умные указатели повсюду, вы можете использовать сборщик мусора Boehm-Demers-Weiser и оставить вашу кодовую базу нетронутой.
Он также позаботится о циклических ссылках.
Нет простого способа сделать это. Как вы выяснили, указатели boost :: shared_ptr
и стандартные указатели не взаимозаменяемы. То, что вы здесь делаете, - это рефакторинг кода, и, к сожалению, рефакторинг занимает много времени и может быть очень утомительным.
Как сказано в sdg, указатели typedef
для shared_ptr
s не являются хорошей идеей и просто увеличивают объем кода, который вам нужно написать.
Во-первых, я бы назвал указатели, которые действительно нужно изменить на shared_ptr
s. Очевидно, вы не хотите менять все указатели на shared_ptr
s. Скорее всего, будет лучше как std :: auto_ptr
s или boost :: scoped_ptr
s, а некоторые будут лучше как boost :: weak_ptr
, и, наконец, некоторые может подойти как простые указатели в стиле C.
Просто просмотрите каждый указатель, который нужно изменить, один за другим, найдите все ссылки на него и внесите необходимые изменения (например, удалите вызовы delete
).
Я был бы очень ограничен при введении shared_ptr в существующую большую базу кода. Если вы действительно хотите использовать интеллектуальные указатели для исправления ошибок, я предлагаю использовать указатели с ограниченной областью видимости, а кроме этого, я бы реорганизовал код и спроектировал четкое владение.