2015-02-22 4 views
1

Первый у нас есть вектор указателей, как:C++ вектор указателей оттеснить по-разному

vehicleGroup<vehicle*> VG; 

В C++, есть разница между:

VG.push_back(new vehicle(1)); 
VG.push_back(new vehicle(2));  

и

//tmp_vehicle is a public class member 
tmp_vehicle = new vehicle(1); 
VG.push_back(tmp_vehicle); 
tmp_vehicle = new vehicle(2); 
VG.push_back(tmp_vehicle); 

Имеет ли vecotr VG адрес самого указателя ИЛИ адрес указателя, на который указывает указатель? Что относительно карты?

ответ

3

VG содержит именно то, что вы просите об этом - указатели на объекты транспортного средства.

Когда вы звоните push_back(), объект принимает объект (в вашем случае «объект» - vector*), делает его копию и помещает в вектор. Вектор использует внутренний кусок памяти, где он хранит объекты, поэтому он должен делать копии.

2

Две версии делают то же самое.

В вашей второй версии tmp_vehicle первые указывает на то, что возвращается new vehicule(1). Затем этот указатель вставляется в вектор, поэтому первый элемент вектора теперь также указывает на это местоположение.
Видел другой способ, вы не храните tmp_vehicule себя в векторе. Вы сохраняете копию этого указателя.

Затем вы делаете tmp_vehicule, указываете на что-то еще. Это не меняет того факта, что вы сохранили указатель на первое местоположение в векторе. Он изменяет то, на что указывает ваша переменная, но никак не меняет вектор.

(И если вы не сохранили этот указатель в векторе, у вас будет утечка памяти после второго присвоения tmp_vector, так как вы потеряли бы все указатели на первое транспортное средство - так что не удаляйте это.)

+0

Итак, vecotr VG содержит адрес указателя, на который указывает указатель вместо самого указателя указателя? – Nyaruko

+1

Да, он хранит указатель на 'vehicleule', а не указатель на указатель на' carule'. – Mat

Смежные вопросы