2

クラスBodaがあるとします:

class Boda {
    ...
};

そしてcydo、このクラスには、スマート ポインターにしたいメンバーがあります (つまり、クラスが破棄されるとすぐに、そのメンバーの割り当てを自動的に解除したいのです)。

Boost のスマート ポインターを使用しているので、次のように記述します。

class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () {
            cydo = boost::shared_ptr<int>(new int(5));
        }
};

これは、スマート ポインターをクラス メンバーとして配置する正しい使用法ですか?

ありがとう、ボダ・シド。

4

2 に答える 2

10
class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () : cydo(new int(5)) {} 
};

とはいえ、なぜラップしたいのかはわかりませんint... :)

于 2010-08-14T11:37:03.473 に答える
2

自問すべき本当の問題は、メンバーをクラスとは別に割り当てる必要があるかどうかです。任意の型のポインターを格納するよりも、クラスにメンバーを格納するだけの方が通常は優れています。それができない場合、たとえば、メンバーの有効期間がコンテナーの作成前または作成後に開始され、メンバーの所有権を超えて延長され、他のオブジェクトに譲渡される可能性がある場合は、ポインターを使用する必要があります。

ポインターを使用する必要がある場合は、未加工のポインターよりもスマート ポインターを優先し、要件に基づいて特定の型を選択する必要があります。メンバーの所有権を他のオブジェクトと共有しないが、含まれるオブジェクトの有効期間がコンテナーの有効期間よりも前または後に開始される可能性があるため、ポインターを使用する必要がある場合、または所有権を他のオブジェクトに譲渡できるが、管理を管理する場合リソース (yield されない限り) はコンテナーの唯一の責任であり、それから優先unique_ptrまたはauto_ptr.

含まれているオブジェクトがこのクラスだけに属していない場合は、shared_ptr. これは、メンバーが異なるスレッドで使用されている場合にも使用できます。所有権がスレッドの 1 つだけに保持されている場合でも、各スレッドが独自shared_ptrの所有権を保持し、あるスレッドでオブジェクトがまだ使用されているときに別のスレッドでオブジェクトが破棄されるのを回避できます。

于 2010-08-14T12:08:13.127 に答える