2

在 C++ 中将对象添加到向量并删除指向该对象的指针后,向量内的对象也会被删除吗?

例如,

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

调用是否仍然有效:

aVect.at(2);

调用“删除”会破坏添加到向量中的对象,还是只会释放指针的对象?

4

5 回答 5

1

Yes you can delete the pointer because, as others have noted you dereference the pointer to it is copied into the vector by value.

It would be more efficient to just construct into the vector like this and avoid new/delete entirely:

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

In C++11 a copy will not be made - the rvalue version of push_back will be used - A will be constructed into it's slot in the vector.

You may not want to create a new vector each time???

std::vector<A> aVect;
int i = 0;
while(i++ < 10)
{    
    aVect.push_back(A());
}
于 2013-02-02T20:34:46.210 回答
1

调用 仍然有效aVect.at(2),因为向量持有*ptrToA. 当您调用aVect.push_back(*ptrToA)时,它A使用赋值运算符设置它。

于 2013-02-02T20:29:03.097 回答
0

在这里,您将对象的副本推送到向量,并且该副本不会被删除。

但是,如果你写:

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

然后你在向量中推送指针,当你删除时,ptrToA你也会删除向量中指针指向的元素。

于 2013-02-02T20:27:49.963 回答
0

您已经创建了 A: 类型对象的向量std::vector<A>,这意味着当您将一些新对象插入其中时,会创建该新对象的副本并将其存储到向量中。

所以是的,即使在新对象被删除之后访问这个元素也是完全安全和有效的。删除原始对象不会以任何方式影响存储在矢量中的副本。

这种向量(保存具有自动存储持续时间的对象的向量)的优点是,一旦向量被破坏,存储这些对象的内存就会自动清理。因此,您的代码中不太可能出现一些内存泄漏以及您的工作量减少,因为您不需要自己处理那些丑陋的内存管理:)

于 2013-02-02T20:28:08.050 回答
0

不,不会的。您std::vector<A>存储对象的实例而不是指针。实际上,您在将 A 推入向量时取消引用指针。

这将导致对象的副本(通过 构建copy constructor)存储在您的向量中。推送对象后,您有 2 个 A 类实例。heap(通过)分配了一个实例new operator。另一个实例位于分配的stack位置 。aVect

另一方面,如果您的向量将存储指针 ( std::vector<*A>),则在删除后ptrToA,存储在向量内的指针指向已释放的内存位置(悬空指针)。尝试访问该指针会导致错误,可能是segfault.

于 2013-02-02T20:28:30.057 回答