2017-10-22 4 views
-1

barがスコープ外であると、スタックから削除されます後からFoo()をクリーンアップする方法がないので、だから私はとき*(新しいはFoo)を使用する

Foo bar = *(new Foo()); 

のようなものを持つ問題について読みますヒープ。実用的な用途はありますか?

+7

"実用的な"ものがない多くのものを書くことができます。あなたはこの問題で問題を特定したようです。特にこの表現について聞かれましたか?あなたはそれがどこかで使用されているのを見ましたか? –

+5

'new Foo()'によって作成されたオブジェクトはすぐに**リークします**。これを使う時間は決してありません。 – StoryTeller

+1

技術的には、 'Foo'のデフォルトのコンストラクタは、作成されたオブジェクトへのポインタをどこかに格納し、漏れを避けることができますが、それは非常に特殊で壊れやすいでしょう。 – aschepler

答えて

2
Foo& foo = *(new Foo); 
delete &foo; 

しかし、しないでください。それは将来のメンテナーを混乱させ、それに正当な理由はない。ポインタを使用します。

+0

なぜこれは正確に機能しますか?私の例とあなたのものからの 'foo'の出力が同じ値を返すのはなぜですか? –

+0

@push_ebp - この例では、新しいオブジェクトの**コピー**を作成します。私のコードでは、新しいオブジェクトにコピーすることなく**参照**を作成します。私は、あなたが 'Foo'のコードを表示しなかったので、あなたの例から' 'foo'"を出力しているかどうかわかりません。 –

+0

私は簡単な 'int&a = *(new int(10))'で答えを試しました。しかし、 'cout << a'は印刷されたアドレスにはならないはずですか?なぜ、その時点で「10」が印刷されていますか? –

関連する問題