У меня есть вопрос о размещении в C ++.
У меня есть этот код:
vector<unsigned char> &v = *new vector<unsigned char>();
Теперь вопрос в том, является ли вообще хорошей идеей разыменование объекта и назначение его непосредственно для ссылки?
На мой взгляд, это облегчает использование объекта, потому что теперь вы можете просто сделать:
v.push_back('a');
v[0];
вместо
v->push_back('a');
(*v)[0];
наконец я могу сделать
delete &v;
освободить мою кучу
Просто из-за количества (одинаковых) хороших ответов:
Я знаю, что могу просто использовать переменную стека
но в моем случае мне это нужно в кучу!
Но вопрос использования кучи или переменной стека другой.
Поэтому я сохранил этот пример простым и, в частности, не спрашивал, следует ли мне вообще выделять переменную.
Это чисто стилистическая проблема. Ни в одном из мест, где я работал
использовали это соглашение, чтобы оно могло
ваша организация, но это является действительное соглашение.
Это должно быть частью более широкого определения того, когда вы используете
указатели, и когда вы используете ссылки. (И вы найдете много
вариации в этом; Я использовал по крайней мере три разных
условности в разных фирмах.)
Является ли вообще хорошей идеей разыменовать объект и присвоить его непосредственно ссылке?
Нет, совсем нет.
Если вам не нужно динамическое размещение, потому что объект должен длиться столько же, сколько текущая область, то вместо этого создайте автоматическую переменную:
vector<unsigned char> v;
Если вам нужен динамический объект, то попытка скрыть его — это хороший способ забыть, что его нужно удалить. Лучше всего использовать умный указатель, чтобы вам вообще не нужно было его удалять; в противном случае используйте указатель.
Не очень хорошая идея хранить объект кучи в основном в ссылочной переменной, по той причине, которую Йоахим Пилеборг приводит в своем комментарии. В конечном итоге вам нужно удалить объект, и это лучше всего сделать через переменную-указатель (в ссылке люди всегда задаются вопросом, живет ли реальный объект в другом месте).
Вы могли бы просто сделать:
...
{
vector<unsigned char> v; // this allocates the vector in the stack
v.push_back('a');
v[0];
}
...
Насколько я вижу, нет необходимости выделять вектор в куче.
Вы должны прочитать о куче и стеке памяти: