C++ pointer and reference with new keyword when in

2019-03-19 06:39发布

问题:

When I want to instantiate a class in C++ I usually go this way

Book bk = new Book();

My professor recently did this

Book &bk = *new Book();

He only told me that he would use a reference to be able to use the dot (eg bk.getTitle();) operator instead of arrow (eg bk->getTitle();). I understand this part of the code but what happens when you use the * operator in combination with new?

Thanks in advance

the full example code can be found here it is the arraystack in the main function

回答1:

This:

Book &bk = *new Book();

is pretty much equivalent to this:

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

But there's one crucial difference; in the original code, you don't have a pointer which you can use to delete the dynamically-allocated object when you're done with it, so you've effectively created a memory leak.

Of course, you could do this:

delete &bk;

but that's extremely non-idiomatic C++, and very likely to cause problems later.

In summary, there's absolutely no good reason to write code like this, so don't do it. Either of the following is fine:

Book bk;
Book bk = Book();


回答2:

I've found a situation that let me think about that syntax. Consider a smart pointer to a Base class and that has to hold a pointer to a derived class and you would like to access some non-virtual things of the derived class after the construction. In this case something like this is legal and may not be so bad:

Derived & d = * new Derived();

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

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

Finally I still preferred the small arrows to the weird ampersands:

Derived d = new Derived();

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

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

But I think that in this a case is just a matter of taste, especially if you access a consistent number of methods.

Other things that lead either to leaks or delete &d; are just bad, bad, bad.