Могу ли я инициализировать ссылку из значения разыменования возврата `new`? - PullRequest
2 голосов
/ 24 октября 2019

Как я видел, new размещает неназванный объект в бесплатном хранилище и возвращает указатель на этот неназванный объект.

Таким образом, мы можем создать ссылку на этот объект:

int* pi = new int(100);
int& ri = *pi;

Что меня интересует, так это то, что я могу создать объект в бесплатном хранилище, не назначая возврат new указателю, а ссылаясь на неназванный объект, назначая значение, на которое нет ссылокиз new по ссылке:

int& x = *(new int(7));

cout << x << endl; // 7
x += 34;
cout << x << endl; // 41

Я хочу знать, могу ли я это сделать, или это плохая идея?

Примечание: на производстве я держусь подальшенасколько это возможно при обработке необработанной памяти, вместо этого я использую интеллектуальные указатели и контейнеры STL.

Ответы [ 2 ]

8 голосов
/ 24 октября 2019

Я хочу знать, смогу ли я это сделать, или это плохая идея?

Вы можете сделать это, но на самом деле не должны. Причина в том, что вам труднее запомнить, чтобы освободить память, которую вы получили, поскольку вы больше не используете указатель. Это выводит вас из равновесия и помогает забыть о вызове delete на всех путях выхода.

Это также будет выглядеть странно, когда вы освобождаетесь, потому что вам нужно сделать что-то вроде

delete &x;
0 голосов
/ 24 октября 2019

Да, вы можете. Но я бы посчитал это плохой идеей. Как только эта ссылка выходит за рамки, у вас нет возможности освободить динамическую память (или вы просто забыли, что это скрытая динамическая память), что, скорее всего, приведет к утечке памяти.

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