2012-02-15 6 views
7

をインスタンス化する際++、私は通常、この道を行くC++は新しいキーワードでポインタと参照私はクラスをインスタンス化したい場合はCで

Book bk = new Book(); 

彼は唯一と言ってくれました矢印の代わりにドット(例:bk.getTitle();)演算子(例bk-> getTitle();)を使用できるようにリファレンスを使用します。コードのこの部分を理解していますが、*演算子を新しいものと組み合わせて使用​​するとどうなりますか?完全なサンプルコードは、それが主な機能

+7

あなたの教授はあなたに記憶を漏らす方法を教えてくれました。 – ildjarn

+2

あなたの教授があなたが本当に本当にすべきではないことの例以外のものにそのコードを使用している場合は、新しい教授を見つけるべきです。 –

+0

おそらくあなたの教授は、「const Book&bk = Book();」と言っていました。そうでない場合、私は正直なところ、あなたの教授が何を意味するのか理解していません。 – Mahesh

答えて

15

でarraystackあるhere見つけることができます

事前に

おかげでこの:

Book &bk = *new Book(); 

たが、これにはかなり同等です:

Book *p = new Book(); // Pointer to new book 
Book &bk = *p; // Reference to that book 

しかし、1つの重要な違いがあります。元のコードでは、あなたはそれを完了したときに動的に割り当てられたオブジェクトdeleteに使用できるポインタを持っていないので、効果的にメモリリークを作成しました。もちろん

、あなたがこれを行うことができます:

delete &bk; 

をそれがだ極めて C++非慣用的な、そして後で問題を引き起こす可能性が非常に高いです。

要約すると、このようなコードを書く理由はまったくないので、ではありません。次のいずれかが問題ありません。

Book bk; 
Book bk = Book(); 
+0

ありがとう、私はそれを使用しないと思う。クラスはC++よりもデザインパターンについてのものなので、このプログラミングスタイルを無視して自分のやり方でやっていきます。 – tim

+1

あなたは確かにメモリリークを作成していませんが、それは巨大な過大宣言だと思います。 –

+0

@Seth:元のコードは実際にリークしています...どういう意味ですか? – ildjarn

0

この構文について考えてみましょう。 Baseクラスへのスマートポインタを考えて、それは派生クラスへのポインタを保持する必要があり、構築後に派生クラスのいくつかの非仮想オブジェクトにアクセスしたいとします。この場合、このようなものは合法で、そんなに悪くないかもしれません。

Derived & d = * new Derived(); 

d.d_method(..whatever..); 
d.d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(&d); 

は最後に、私はまだ奇妙なアンパサンドに小さな矢印好適:

Derived d = new Derived(); 

d->d_method(..whatever..); 
d->d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(d); 

をしかし、私はこのケースだと思います味の問題です。特に、一貫した数のメソッドにアクセスする場合は特にそうです。

リークやdelete &d;のいずれかにつながる他のものは悪い、悪い、悪いです。

関連する問題