1

スマート ポインターの恩恵を受けるために Boost ライブラリを使用しています: shared_ptr

単体テストで、悪い割り当てをしていると思われます。

私の実装の欠点は何ですか、特にコメントの疑いがある命令は何ですか?

shared_ptrポインターを解放する必要がありますか (単体テストで割り当てている方法では不可能だと思います)?

何かアドバイス?どうもありがとう!

Class2 宣言:

static boost::shared_ptr<Class1> getInstanceOfClass1();

Class2 の定義:

boost::shared_ptr<Class1> Class2::getInstanceOfClass1()
{
    boost::shared_ptr<Class1> inst1 = boost::make_shared<Class1>();

    //.... some instructions on inst1

    return inst1 ;
}

Boost.Test を使用した単体テスト:

BOOST_AUTO_TEST_CASE( test_some_label_here )
{
    string input;
    //instructions...
    // mocking the input
    //...

    Class1 a = *(Class2::getInstanceOfClass1()); //suspected
    int code = a.useInputAndReturnCode(input);

    // having CODE_X as a macro
    BOOST_CHECK_EQUAL(code, CODE_X); 
}
4

2 に答える 2

1

ポイントされたオブジェクトは、shared_ptr がポイントしなくなると自動的に破棄されるため、shared_ptr を解放する必要はありません。一方で、shared_ptr と通常のポインタを同じオブジェクトに混在させないようにする必要があります。オブジェクトを指す shared_ptr がないためにオブジェクトがブーストによって破棄された場合、通常のポインタのおかげでアクセスしようとするとエラーが発生します。 .

于 2013-10-03T09:43:44.263 に答える
1

奇妙な使用例ですが、問題ないはずです。

Class2 a = *(Class2::getInstanceOfClass1()); //suspected

何が起こるかというと、から共有ポインタで返されたを受け取る ctor を呼び出すことによってClass2インスタンスが作成されるということです。ネストされたテンポラリ (共有ポインタ) は式の最後で自動的に削除され、式全体の最後で初期化に使用されたインスタンスが削除されます。aClass2Class1getInstanceOfClass1Class1a

アドバイス?多分あなたは書くつもりでしたClass1 a = ...か?その場合は、検討することをお勧めします

auto ap = Class2::getInstanceOfClass1();
int code = ap->useInputAndReturnCode(input);

のコピーを作成しないようにしClass1ます。

于 2013-10-03T09:28:46.310 に答える