私は、A
は抽象クラスとB
ある階層を持ちC
、およびD
はA
の子孫です。私は適切にスマートポインタを使用することができます。このようにC++共有PTRリリース
void doCall() {
switch (it) {
case 4:
theBase = std::make_shared<B>(B(8));
break;
case 3:
theBase = std::make_shared<C>(C(6));
break;
default:
theBase = std::make_shared<D>(D(0));
break;
}
theBase->method();
}
と私は、継承を使用することができます。私はこれを行うdoCall()
インサイド
class Controller {
private:
int it;
std::shared_ptr<A> theBase;
public:
void doCall();
//more code
}
:私はA
への共有のポインタを持つクラスController
(MVCパターン)を持っていますit
の値に従って必要なクラスを取得します。
Controller x;
x.doCall();
x.doCall();
私は二回doCall()
を呼び出していますので、私は二回switch
でつもりです:
は、私はこのコードを呼び出すと仮定します。つまり、std::make_shared
が2回呼び出され、theBase
に割り当てられます。これは安全ですか?
doCall()
を初めて呼び出すと、共有ポインタがあります。 2回目に別のstd::shared_ptr
をtheBase
に割り当てようとしています。古いポインタ(最初の呼び出しの1つ)が破棄され、新しいポインタが作成されますか?それともこのようなことをしなくてはなりませんか?
if (*theBase != nullptr) {
theBase.reset(); //delete the old one;
}
switch (it) { /* ... */}
たびdoCall()
が呼ばれ、私はtheBase
のサブクラスである新しいオブジェクトを作成する必要があります。私はそれを正しくしていますか?
読んでいる:http://en.cppreference.com/w/cpp/memory/shared_ptr/operator%3D _ "これが既にオブジェクトを所有していて、それを所有する最後のshared_ptrであり、rがそうでない場合*これと同じですが、オブジェクトは所有されているDeleterを通して破棄されます。 "_ –
@RichardCritten reset()を呼び出す必要はないと思うので、2回目にtheBase = std :: make_sharedを呼び出すと、古いポインタは削除され、新しいものが作成されます。メモリリークはなく、我々はすべて満足しています。ありがとうございました! –