6

私は現在、スマートポインターの使用を導入することにより、コードベースのいくつかの弱点を修正しようとしています。コードベースは非常に大きく、1対多のコーヒーを飲んだクモのように相互に関連しています。

人々が以前に試したことがあるのか​​、そして彼らのアプローチは何だったのかと私は思っていました。

私の最初のステップは、次のようにtypedefクラスを作成することでした。

#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;

スマートポインタが有効になっていると、完全に失敗します。

コンパイルエラーの量を減らすために、この早い段階で何かできることがあるのだろうか、それともケースバイケースで物事をとっているのではないかと思っていました。

乾杯リッチ

4

4 に答える 4

9

これをしないでください:私が意味するtypedef。

おそらく、古いコードには少なくともいくつかの削除呼び出しが含まれていますか?スマートポインタの場合、これは確かに失敗します。

スマートポインタは特定のものかどうか、つまりコードベースを介して特定のインスタンスを追跡します。それを機能させてから、次に進みます。幸運を!

于 2010-02-24T16:26:56.313 に答える
5

どこにでもスマートポインターを導入しようとする代わりに、Boehm-Demers-Weiserガベージコレクターを使用して、コードベースをそのままにしておくことができます。

また、循環参照も処理します。

于 2010-02-24T16:34:02.020 に答える
3

これを行う簡単な方法はありません。ご存知のように、boost::shared_ptrsと標準ポインタは互換性がありません。ここで行っているのはコードのリファクタリングです。残念ながら、リファクタリングには長い時間がかかり、非常に面倒な作業になる可能性があります。

sdgが言ったように、 sのtypedefポインターを使用することshared_ptrは良い考えではなく、作成する必要のあるコードの量を増やすだけです。

まず、実際にsに変更する必要のあるポインターを特定しますshared_ptrshared_ptr明らかに、すべてのポインタをsに変更する必要はありません。ほとんどの場合、std::auto_ptrsまたはboost::scoped_ptrsの方が良いでしょうし、いくつかはのように良いでしょうboost::weak_ptr。そして最後に、いくつかはプレーンなCスタイルのポインターとしてちょうど良いかもしれません。

1つずつ変更する必要のある各ポインターを調べ、そのポインターへのすべての参照を見つけて、必要な調整を行います(たとえば、への呼び出しを削除しますdelete)。

于 2010-02-24T16:36:05.883 に答える
0

shared_ptrを既存の大規模なコードベースに導入することは非常に制限されます。本当にスマートポインターを使用してエラーを修正したい場合は、スコープポインターを使用することをお勧めします。それ以外の場合は、コードをリファクタリングして、明確な所有権を設計します。

于 2010-07-25T08:19:49.410 に答える