1

動的メモリがアタッチされているオブジェクト (関数内でローカルに宣言されている) を返す方法がわかりません。問題はデストラクタです。これは、オブジェクトがスコープ外になったときに動的メモリを実行して削除します。つまり、オブジェクトを返して、削除されたメモリ内のデータを使用したい場合です。オーバーロードされた加算演算子に対してこれを行っています。

私は次のようなことをしようとしています:

MyObj operator+( const MyObj& x, const MyObj& y )
{
   MyObj z;

   // code to add x and y and store in dynamic memory of z

   return z;
}

私のデストラクタは単純です:

MyObj::~MyObj()
{ delete [] ptr; }

どんな提案でも大歓迎です!

4

2 に答える 2

3

大丈夫です。

削除する前に、オブジェクトは別のオブジェクトにコピーされるか、一時的に使用されます。

しかし...

明確に定義されたコピーコンストラクターを作成してみてください(持っていない場合)。5 のルールに従う必要があります。

一方で、不要なコピーと 1 つの余分な破棄を回避するために、RVO の最適化がコードに適用される可能性は十分にあります。

さらに、C++11 は不必要なコピーを避けるためにムーブ セマンティクスを提供します。これを行うには、move-constructormove-assignmentを記述する必要があります。

于 2013-11-04T21:53:21.910 に答える
2

ptrの内容を新しいオブジェクトに コピーするコピー コンストラクターを提供する必要があります。

MyObjの内容をコピーするコピー コンストラクターがない場合ptr、返されたオブジェクトには、ptr削除されたメモリへのポイントがあります。言うまでもなくptr、この状態でアクセスしようとすると、悪いことが起こります。

一般に、クラスのデストラクタを作成する必要がある場合は、動的メモリやその他のリソースのコピーを処理するために、コピー コンストラクタと代入演算子も作成する必要があります。これは、WhosCraig が言及した 3 つのルールです。

C++11 をサポートする最新のコンパイラを使用している場合は、on the move セマンティクスも参照することをお勧めします。

于 2013-11-04T21:53:22.840 に答える