Как представить повышение:: shared_ptr в существующую (большую) кодовую базу C++?

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

Я задавался вопросом, попробовали ли люди прежде и каков их подход был.

Мой первый шаг был к классам определения типа, следующим образом.

#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, когда интеллектуальные указатели будут включены.

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

Богатые аплодисменты

6
задан Georg Fritzsche 25 July 2010 в 08:30
поделиться

4 ответа

Не делайте этого: я имею в виду определения типов.

Предположительно, в старом коде есть хотя бы несколько вызовов delete ? Что, безусловно, не сработает в случае умного указателя.

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

9
ответ дан 8 December 2019 в 13:45
поделиться

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

Он также позаботится о циклических ссылках.

5
ответ дан 8 December 2019 в 13:45
поделиться

Нет простого способа сделать это. Как вы выяснили, указатели 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 ).

3
ответ дан 8 December 2019 в 13:45
поделиться

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

0
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: