0

ポインターによって参照される構造体の一部のマテリアルを返し、構造体を削除したいと思います。

Java では、値を返すだけで、ガベージ コレクション システムが構造体を自動的に削除します。

しかし、C++ では、一時変数を使用して戻り値を格納し、ポインタを削除してから、格納された値を返すという、私が想像できる方法はあまりきれいではありません。

コンマ式を " " として使用する別のトリッキーな方法を試してみましreturn ptr->value, delete ptrたが、「void 値は無視されないはずです」というコンパイル エラーが発生します。

それをよりエレガントに達成する方法はありますか?

どうもありがとう。


更新しました

みんなからの提案に感謝します。実際、私の問題の元の動機は、短いコードに使用したいコンマ式に関するものです。そして、議論はC++でのポインターの使用法に関するものであることがわかりました。これもまた非常に興味深いトピックです。

私は何年も C を使ってきたので、生のポインターには慣れていて、スマート ポインターの経験はほとんどありません。私が最初に考えたのは、ポインターが必要な基本的な条件が 2 つあります。1つはヒープに割り当てられた大きなメモリへの参照で、もう1つはリンクリストノードやツリーノードなどの動的割り当て用です(たとえば、BSTのような構造体を書いているときに元の問題が発生しました)。

では、C++ プログラミングでは、両方のケースでスマート ポインターが最適な選択でしょうか? 低レベルのライブラリで作業するなど、効率を考慮した場合、生のポインタをクラス内に完全にカプセル化して、メモリ リークのリスクを軽減することは可能ですか? 再度、感謝します。

4

4 に答える 4

4

もちろん。ポインターを使用しないでください。必要な場合は、スマート ポインター ( std::shared_ptrstd::unique_ptr) を使用してください。

あなたの場合、それは次のように簡単かもしれません

//...
return obj.value;  //no pointer needed
                   //automatic memory management

また

//...
return smartPtr->value;  //smart pointer automatically cleans up after itself

C++ は C として教えられており、ポインタとメモリ管理の問題があるため、C++ でそれを行うクリーンな方法をおそらく想像できないでしょう。適切な C++ はRAIIを使用しており、その影響を受けません。

于 2012-12-30T14:31:32.357 に答える
2

通常の解決策は、最初にポインタを使用しないために削除するものがないことです。次に、クリーンアップする他のリソースがある場合は、デストラクタでクリーンアップを実行します。デストラクタは、returnステートメントのに自動的に呼び出されます。は、戻り値をコピーする必要がある場所にコピーしました。

返すことができる場合はコピーできるので、動的に割り当てられるべきではありません。最も注目すべき例外は、ポリモーフィックオブジェクトが関係している場合です。ポリモーフィズムが機能するにはポインタまたは参照が必要であり、ほとんどの場合(例外はありますが)、ポリモーフィックオブジェクトは動的に割り当てられます。この場合、ポリモーフィックオブジェクトの実際の存続期間がローカルスコープに対応している場合は、を使用できます std::auto_ptr(またはstd::unique_ptr、まれにC ++ 11を使用できます)。

于 2012-12-30T15:43:33.110 に答える
2

いいえ、あなたの場合、関数は何らかの値を返すことになっているためですが、コンマ演算子は右端のオペランドに評価されdeleteますvoid

于 2012-12-30T14:30:40.293 に答える
1

関数内でポインタを動的に割り当てる場合。あなたができることは次のとおりです。

int変数を返したいと考えています

int foo()
{
  MyStruct *obj;

  obj=new MyStruct;

  .....

  int x=obj->value;

  delete obj;

  return x;
}

または、次のこともできます。

int foo()
{
  MyStruct obj;

  obj=new MyStruct;

  .....

  return obj.value;
}

これにより、メモリ リークを心配する必要がなくなります。これが最も簡単な方法です。確かに、スマートポインターを使用できます。しかし、あなたのレベルでは、この方法に固執すると思います。

于 2012-12-30T14:41:47.033 に答える