在C ++中向对象添加对象并删除指向该对象的指针后,向量内的对象是否也会被删除?
例如,
int i = 0;
std::vector<A> aVect;
while(i++ < 10)
{
A *ptrToA = new A();
aVect.push_back(*ptrToA);
delete ptrToA;
}
打电话是否仍然有效:
aVect.at(2);
对“删除”的调用是否会破坏添加到向量中的对象,还是只会释放指针的对象?
答案 0 :(得分:1)
调用aVect.at(2)
仍然有效,因为该向量包含*ptrToA
的副本。当您致电aVect.push_back(*ptrToA)
时,它会使用赋值运算符设置其A
。
答案 1 :(得分:1)
是的,您可以删除指针,因为正如其他人已经注意到您取消引用它的指针被按值复制到向量中。
像这样构造到矢量并避免新的/完全删除会更有效:
int i = 0;
while(i++ < 10)
{
std::vector<A> aVect;
aVect.push_back(A());
}
在C ++ 11中,不会复制一个副本 - 将使用push_back的右值版本 - 将在向量中构造它的插槽。
您可能不想每次都创建一个新的矢量
std::vector<A> aVect;
int i = 0;
while(i++ < 10)
{
aVect.push_back(A());
}
答案 2 :(得分:0)
在这里,您将对象的副本推送到向量,此副本不会被删除。
但是如果你写:
int i = 0;
while(i++ < 10)
{
A *ptrToA = new A();
std::vector<*A> aVect;
aVect.push_back(ptrToA);
delete ptrToA;
}
然后你在向量中推送指针,当你删除ptrToA
时,你也删除了向量中指针所指向的元素。
答案 3 :(得分:0)
您已创建A类型的对象矢量:std::vector<A>
,这意味着当您向其中插入一些新对象时,会创建此新对象的复制并将其存储到矢量中。
所以是的,即使删除了新对象,访问此元素也非常安全有效。 删除原始对象不会以任何方式影响存储在矢量中的副本。
这种向量(保存具有自动存储持续时间的对象的向量)的优点是,一旦向量被破坏,存储这些对象的存储器将被自动清理。因此,不太可能在代码中存在内存泄漏以及为您工作的工作量减少,因为您不需要自己处理那些丑陋的内存管理:)
答案 4 :(得分:0)
不,不会。您的std::vector<A>
存储对象实例而不是指针。实际上,在将A推入向量时,您将取消引用指针。
这将导致对象的副本(通过copy constructor
构建)存储在向量中。推送对象后,您有2个A类实例。在heap
(通过new operator
)中分配了一个实例。另一个实例位于stack
,其中aVect
已分配。
另一方面,如果向量存储指针(std::vector<*A>
),则在删除ptrToA
之后,存储在向量内的指针指向已释放的内存位置(dangling pointer) 。试图访问该指针会导致错误,可能是segfault
。