Удалить указатель выделения после добавления его в вектор

Когда вы добавите объект в вектор в 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» уничтожать объект, который был добавлен к вектору, или он только освободит объект указателя?

1

Решение

Да, вы можете удалить указатель, потому что, как другие заметили, вы разыменовываете указатель на него, который копируется в вектор по значению.

Было бы эффективнее просто встроить в вектор вот так и полностью избежать 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());
}
1

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

Он все еще будет действительным, чтобы позвонить aVect.at(2), так как вектор содержит копию *ptrToA, Когда ты звонил aVect.push_back(*ptrToA)установил его A используя оператор присваивания.

1

Здесь вы нажимаете копия объекта в вектор, и эта копия не будет удалена.

Однако, если вы напишите:

int i = 0;
while(i++ < 10)
{
A *ptrToA = new A();
std::vector<*A> aVect;
aVect.push_back(ptrToA);
delete ptrToA;
}

Затем вы нажимаете указатели на вектор и когда вы удаляете ptrToA Вы также удаляете элемент, на который указывает указатель в векторе.

0

Вы создали вектор объектов типа A: std::vector<A>Это означает, что когда вы вставляете в него какой-то новый объект, копия этого нового объекта создается и сохраняется в векторе.

Так что да, доступ к этому элементу совершенно безопасен и действителен даже после удаления нового объекта. Удаление исходного объекта никак не повлияет на копию, хранящуюся в вашем векторе.

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

0

Нет, не будет. Ваш std::vector<A> хранит экземпляры объектов, а не указатели. На самом деле вы разыменовываете указатель, нажимая A на вектор.

Это приведет к копированию объекта (построено через copy constructor) храниться внутри вашего вектора. После нажатия на объект у вас есть 2 экземпляра класса А. Один экземпляр выделен в heap (сквозь new operator). Другой экземпляр находится на stack, где aVect выделено.

С другой стороны, если ваш вектор будет хранить указатели (std::vector<*A>), после удаления ptrToAуказатель, сохраненный внутри вектора, указывает на уже освобожденную область памяти (свисающий указатель). Попытка получить доступ к этому указателю приведет к ошибке, вероятно, segfault,

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