2012-04-17 2 views
1
私のコードからの抜粋があり

ローカルスコープでダイナミックアロケーションを避け

const std::pair<Info, const ElementHandler&>& handle() const { 
        FileHandler fileHandler = FileHandler(); 
        std::pair<Info, const ElementHandler&> result = std::pair<Info, const FileHandler&> (info, fileHandler); 
        return result; 
       } 

はI次のコンパイル・エラーがあります。

error: cannot declare field ‘std::pair<Synchronizer::Info, Synchronizer::ElementHandler>::second’ to be of abstract type ‘Synchronizer::ElementHandler’ 

私はアイデアを維持するためのコードを書くことができますどのように?可能でしょうか、またはポインタと動的割り当てを使用する必要がありますか?

+1

かかわらず、コンパイルエラーの、ローカルで宣言された変数への参照を返すことはありません! – Nick

答えて

1

"Avoid dynamic allocation in local scope".

それはあなたの壊れたコードの推進が必要だ場合、私はあなたが;-)たくないものを行うには、それを修正する方法を伝えることで、トレンドに従っていないだろうが。代わりに、その意味を適切に考慮する必要があります。あなたは、呼び出し元のニーズに合ったスコープを持つ変数を持つ必要があります。ローカルの自動変数は除外されなければなりません。関数が復帰すると、それらは破棄されます。だから、あなたは可能性:関数が(あなたのコンパイラは、いくつかをサポートすることと呼ばれ、スレッド安全性の問題があるかもしれませんたびに

  • 機能を使用するにはstatic変数、またはグローバル変数のスコープが、それは同じ変数になりますスレッド固有のキーワード、POSIXにはスレッド固有のデータをサポートする関数がありますが、1オブジェクトあたりのスレッド数は依然として制限されている可能性があります)
  • 多くの変数のスペースを持つバッファを作成し、何らかの方法でクライアントコードに適合します(例えば、クライアントが返される順序でクライアントを解放し、同時に配列サイズ以上を必要としないことを知っている配列を回転する)
  • クライアントコードで生涯について心配してください(おそらくあなたより多くのことを知っているでしょう)。ここbool load_my_x(X&);
    • 問題呼び出し側がFileHandlerのためのスペースを割り当てる必要はないということです単にElementHandler
1
  1. shared_ptrのいくつかの種類としておそらくnewfileHandlerを割り当て、または。 fileHandlerへの現在の参照は、関数が終了すると無効になります。
  2. resultを値で参照しないで返してください。
+0

elementhandlerが仮想であるため、彼はこのパスを開始したと仮定します。 –

1

とにかく動的割り当てを使用する必要があります。

あなたの関数内では、ローカル変数 'fileHandler'を作成していて、そこへの参照を返します。関数が返るとすぐに、 'fileHandler'は有効範囲外になり破棄され、参照が無効になります。

スマートポインタ(unique_ptr、shared_ptr、...)を使ってこの問題をうまく解決できると思います。スマートポインタはElementHandlerを指すことができ、ElementHandlerに仮想デストラクタがある場合、ペアが削除されたり範囲外になったりすると正しく破棄されます。

+0

は、ここを含め、可能な限りshared_ptrに対してunique_ptrを優先します。 –

+0

よろしいですか?答えを変更しました。 – Patrick

+0

@MooingDuck実際には、おそらく 'shared_ptr'が望ましい場合があります。彼が本当に必要とするのはバリューセマンティクスですが、バリューセマンティクスは多態性では機能しません。 'shared_ptr'は真の値セマンティクスを持っています。オブジェクトへのポインタは参照セマンティクスを取得しますが、それがconstへのポインタであるという事実は、この区別が間違いであることを意味します。 –

関連する問題