2011-10-28 12 views
3

私はクラスcnListを持っており、柔軟な数のアイテムを格納しています。このリストは、後でcnArrayオブジェクトに変換する必要があります。リストクラスは既にメソッドcnArray cnList::toArray() constを実装しています。データをコピーせずにローカルオブジェクトをポインタに変換しますか?

ご覧のとおり、参照やポインタではなくオブジェクトを返します。しかし、リストを配列に変換した後に行う必要があるのは、後でクラスメンバーで使用するためにこの配列を格納することです。つまり、そのポインタを持つ必要があります。cnArrayオブジェクトです。

実際の問題は、単純に配列アドレスを使用しているということです。現在の方法の後に解放されるため、アドレスはオプションではありません。

このオブジェクトを何らかの形で「ポインタ」に変換してオブジェクトを解放することはできますか?
もちろん、object-arrayのすべてのエントリをpointed-arrayにコピーすることはできますが、それはあまり効率的ではないので、私が望むものではありません。

私はcnArrayオブジェクトへのポインタを返しますが、私はこの周りがあれば知りたいcnListでメソッドを実装することができたという事実を認識しています。

+0

cnListが参照カウントを実行しているかどうかを確認しましたか? – Jimmy

+1

cnArrayでmoveセマンティクスを実装しましたか?なぜ価値によって戻るのではないでしょうか? –

+0

@ジミーなぜそれはすべきですか?これはトピックとは何が関係していますか? –

答えて

4

戻り値toArrayから構築された新しいcnArrayをヒープから割り当てることができます。あなたは右のそれを行う場合は、Return Value Optimizationは、コンパイラは冗長コピーを最適化することができます:

cnArray *p = new cnArray(list.toArray()); 

そのグラムを表示するには++のRVOはhttp://ideone.com/loXAT

+0

うわー。実際、それはとてもシンプルで明白です。ありがとうございます。うまく動作します! –

0

ポインタは、通常の地元の人と同様に服従して使用することができます。問題は、自動的に、ヒープオブジェクトを使用するヒープ割り当てオブジェクトに変換しないことです。しかし、shared_ptrを使用することをお勧めします。

cnArray* Ptr = new cnArray(); 
(*Ptr) = cnList::toArray(); 
+0

このコードを使用すると、未定義の結果が得られます。保存されているデータが壊れてしまいます。ポインタを返すcnList :: toArray()を書き直すことは、私の他のコードではありません。 –

0

cnList::toArray()では、動的に、cnArray* objを割り当てることができますobjにごcnListオブジェクトを変換してからobjを返します。生の(またはスマートな)ポインタを戻すので、スコープから外れたときに割り当て解除されません。

+0

あなたはオブジェクトの代わりにポインタを返すメソッドを実装することで意味していたと思います。これは実際には非常にうまくいく、私はそれをそのまま残すと思う。ヒープ上のオブジェクトの割り当てが解除されないようにすれば、興味がありました。 –

0

cnListががにをコピーされている参照、コピーを排除します新しいcnArray。 cnArray::ToList関数は、既存のcnArrayへの参照またはポインタを受け入れるように記述されている可能性がありますが、そうではありませんでした。インタフェースを変更できる場合は、これを考慮する必要があります。

返されたcnArrayは、範囲外になったときに破棄されるローカルオブジェクトであり、これを理解しているようです。唯一の選択肢は、オブジェクトのメンバ変数に別のコピーを作成することです。

一部のC++コンパイラでは、余分なコピーが作成されないようにcopy elisionを実行します。戻り値を一時的に代入するのではなく、メンバー変数に直接代入します。

関連する問題