C ++ выделить * новый объект () для ссылки

У меня есть вопрос о размещении в C ++.
У меня есть этот код:

vector<unsigned char> &v = *new vector<unsigned char>();

Теперь вопрос в том, является ли вообще хорошей идеей разыменование объекта и назначение его непосредственно для ссылки?

На мой взгляд, это облегчает использование объекта, потому что теперь вы можете просто сделать:

v.push_back('a');
v[0];

вместо

v->push_back('a');
(*v)[0];

наконец я могу сделать

delete &v;

освободить мою кучу

Просто из-за количества (одинаковых) хороших ответов:
Я знаю, что могу просто использовать переменную стека
но в моем случае мне это нужно в кучу!
Но вопрос использования кучи или переменной стека другой.

Поэтому я сохранил этот пример простым и, в частности, не спрашивал, следует ли мне вообще выделять переменную.

0

Решение

Это чисто стилистическая проблема. Ни в одном из мест, где я работал
использовали это соглашение, чтобы оно могло
ваша организация, но это является действительное соглашение.

Это должно быть частью более широкого определения того, когда вы используете
указатели, и когда вы используете ссылки. (И вы найдете много
вариации в этом; Я использовал по крайней мере три разных
условности в разных фирмах.)

2

Другие решения

Является ли вообще хорошей идеей разыменовать объект и присвоить его непосредственно ссылке?

Нет, совсем нет.

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

vector<unsigned char> v;

Если вам нужен динамический объект, то попытка скрыть его — это хороший способ забыть, что его нужно удалить. Лучше всего использовать умный указатель, чтобы вам вообще не нужно было его удалять; в противном случае используйте указатель.

5

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

0

Вы могли бы просто сделать:

...
{
vector<unsigned char> v; // this allocates the vector in the stack
v.push_back('a');
v[0];
}
...

Насколько я вижу, нет необходимости выделять вектор в куче.

Вы должны прочитать о куче и стеке памяти:

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector