3

次のC++クラスがあります

class Object 
{
    public:
        Object(parameters);
 ...
        const Object& method1(parameters) const;
        Object& method2(parameters) const;

    private:
}

method1method2実装は次のとおりです。

const Object& Object::method1(parameters) const 
{
...
    Object* _obj = new Object;
...
    return *_obj;
}

Object& Object::method2(parameters) const 
{
...
    Object* _obj = new Object;
...
    return *_obj;
}

コピー コンストラクターを定義していません。関数が割り当てられたオブジェクトへの参照を返すことはわかっていますが、それを削除するには「削除」を使用する必要があります。メモリの浪費を避け、情報の隠蔽を維持したいと考えています。

これはこれを行う正しい方法ですか、それとも何か不足していますか?

4

4 に答える 4

4

オブジェクトを削除するものは何もないので、これは悪いことです。それらは漏れます。

スマート ポインター、オブジェクトを新しくせずにコピーしたもの、または生のポインターを返します。

于 2013-07-26T08:12:08.897 に答える
4

クラスにもよりますが、動的に割り当てられたオブジェクトへの参照を返すことは、おそらく良い考えではありません。

  • クラスに値のセマンティクスがある (コピーと割り当てをサポートする) 場合は、実際のオブジェクトを返す必要があります。値セマンティクスを持つオブジェクトの動的割り当ては避ける必要があります。

  • クラスが本格的なエンティティ オブジェクトであり、その有効期間がアプリケーションによって管理されている場合は、おそらく生のポインターを返す必要があります。

  • 返されたオブジェクトをアプリケーションで管理する前にさらに処理が必要な場合は、おそらく を返す std::auto_ptrか、C++11 を使用できる場合はstd::unique_ptr;を返す必要があります。アプリケーションロジックが引き継ぐと、呼び出し元はそれを解放します。その間に何かが発生すると、オブジェクトは自動的に破棄され、メモリが解放されます。

于 2013-07-26T08:19:27.193 に答える
2

C++11 を使用している場合は、戻り値の型としてstd::unique_ptr<object>orを使用できます (ユースケースによって異なります)。std::shared_ptr<object>オブジェクトは、最後のスマート ポインターが消えるとすぐに自動的に破棄されます。

これらのクラスは、コンパイラが C++11 をサポートしていない場合に備えて、boost でも利用できます (つまり、 にstd::unique_ptrマップされます)。boost::scoped_ptr必要に応じて使用することもできstd::auto_ptrますが、C++11 では非推奨になっています。

于 2013-07-26T08:12:22.100 に答える
1

この場合、戻り値をポインターとして使用するobject* object::methodn(parameters) constか、コピーコンストラクターを実装してから、参照ではなくオブジェクトのコピーを返す必要があります。これは、の宣言を見method1たりmethod2、メモリリークが発生していると想像することさえできないためです。中身。また、C++11 を使用している場合はrvalue reference、コピー コンストラクターを使用してメモリを軽減するために使用できます。C++11 の右辺値参照に関する情報は次のとおりです。

于 2013-07-26T08:10:14.570 に答える