Указатель C ++ и ссылка с новым ключевым словом при создании экземпляра - PullRequest
12 голосов
/ 15 февраля 2012

Когда я хочу создать экземпляр класса в C ++, я обычно иду по этому пути

Book bk = new Book();

Мой профессор недавно сделал это

Book &bk = *new Book();

Он только сказал мне, что будет использовать ссылку, чтобы иметь возможность использовать оператор точки (например, bk.getTitle ();) вместо стрелки (например, bk-> getTitle ();). Я понимаю эту часть кода, но что происходит, когда вы используете оператор * в сочетании с новым?

Заранее спасибо

полный пример кода можно найти здесь это массив в основной функции

Ответы [ 2 ]

20 голосов
/ 15 февраля 2012

Это:

Book &bk = *new Book();

в значительной степени эквивалентно этому:

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

Но есть одно принципиальное отличие;в исходном коде у вас нет указателя, который можно использовать для delete динамически размещаемого объекта, когда вы закончите с ним, поэтому вы фактически создали утечку памяти.

OfКонечно, вы можете сделать это:

delete &bk;

, но это крайне не идиоматический C ++, и очень вероятно, что это вызовет проблемы позже.

В итоге, абсолютно нетхорошая причина для написания такого кода, поэтому не делайте этого .Подойдет любое из следующего:

Book bk;
Book bk = Book();
0 голосов
/ 09 июля 2014

Я обнаружил ситуацию, которая позволяет мне думать об этом синтаксисе. Рассмотрим умный указатель на класс 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;, просто плохие, плохие, плохие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...