Когда вы добавите объект в вектор в C ++ и удалите указатель на этот объект, будет ли удален и объект внутри вектора?
например,
int i = 0;
std::vector<A> aVect;
while(i++ < 10)
{
A *ptrToA = new A();
aVect.push_back(*ptrToA);
delete ptrToA;
}
будет ли все еще допустимо позвонить:
aVect.at(2);
Будет ли вызов «delete» уничтожать объект, который был добавлен к вектору, или он только освободит объект указателя?
Да, вы можете удалить указатель, потому что, как другие заметили, вы разыменовываете указатель на него, который копируется в вектор по значению.
Было бы эффективнее просто встроить в вектор вот так и полностью избежать new / delete:
int i = 0;
while(i++ < 10)
{
std::vector<A> aVect;
aVect.push_back(A());
}
В C ++ 11 копия не будет сделана — будет использоваться версия push_back rvalue — A будет встроен в его слот в векторе.
Вы можете не захотеть каждый раз создавать новый вектор ???
std::vector<A> aVect;
int i = 0;
while(i++ < 10)
{
aVect.push_back(A());
}
Он все еще будет действительным, чтобы позвонить aVect.at(2)
, так как вектор содержит копию *ptrToA
, Когда ты звонил aVect.push_back(*ptrToA)
установил его A
используя оператор присваивания.
Здесь вы нажимаете копия объекта в вектор, и эта копия не будет удалена.
Однако, если вы напишите:
int i = 0;
while(i++ < 10)
{
A *ptrToA = new A();
std::vector<*A> aVect;
aVect.push_back(ptrToA);
delete ptrToA;
}
Затем вы нажимаете указатели на вектор и когда вы удаляете ptrToA
Вы также удаляете элемент, на который указывает указатель в векторе.
Вы создали вектор объектов типа A: std::vector<A>
Это означает, что когда вы вставляете в него какой-то новый объект, копия этого нового объекта создается и сохраняется в векторе.
Так что да, доступ к этому элементу совершенно безопасен и действителен даже после удаления нового объекта. Удаление исходного объекта никак не повлияет на копию, хранящуюся в вашем векторе.
Преимущество этого вида вектора (вектор, который содержит объекты с автоматической продолжительностью хранения) заключается в том, что память, в которой хранятся эти объекты, очищается автоматически после разрушения вектора. Поэтому менее вероятно, что в вашем коде будет некоторая утечка памяти, а также меньше работы для вас, так как вам не нужно заботиться об этом уродливом управлении памятью самостоятельно 🙂
Нет, не будет. Ваш std::vector<A>
хранит экземпляры объектов, а не указатели. На самом деле вы разыменовываете указатель, нажимая A на вектор.
Это приведет к копированию объекта (построено через copy constructor
) храниться внутри вашего вектора. После нажатия на объект у вас есть 2 экземпляра класса А. Один экземпляр выделен в heap
(сквозь new operator
). Другой экземпляр находится на stack
, где aVect
выделено.
С другой стороны, если ваш вектор будет хранить указатели (std::vector<*A>
), после удаления ptrToA
указатель, сохраненный внутри вектора, указывает на уже освобожденную область памяти (свисающий указатель). Попытка получить доступ к этому указателю приведет к ошибке, вероятно, segfault
,