向量和向量指针中的循环迭代

时间:2019-03-06 07:09:13

标签: c++

我的代码是

//Pointer to a Vector
std::vector<int> *ptr =  new std::vector<int>;
ptr->push_back(20);
ptr->push_back(30);
ptr->push_back(40);
std::vector<int>::const_iterator pend = ptr->end();
for(std::vector<int>::const_iterator it = ptr->begin(); it != pend;  ++it){
    cout<<*it<<endl;
}
ptr->clear();
delete ptr;
pend = ptr->end();
for(std::vector<int>::const_iterator it = ptr->begin(); it != pend;  ++it){
    cout<<*it<<endl;
}


//Normal Vector
std::vector<int> nptr= {20,30,40};
std::vector<int>::const_iterator end = nptr.end();
for(std::vector<int>::const_iterator it = nptr.begin(); it != end;  ++it){
    cout<<*it<<endl;
}
nptr.clear();
end = nptr.end();
for(std::vector<int>::const_iterator it = nptr.begin(); it != end;  ++it){
    cout<<*it<<endl;
}

在上面的示例代码中,我在清除容器之前和之后迭代指向vector和vector容器的指针。在正常向量情况下,开始和结束指针在清除后表示相同的元素,这意味着容器为空。在指向向量的指针中,使用清除并删除与向量关联的内存后,开始指针和结束指针就永远不会重置。

上面代码的输出,

//pointer to vector before clear
20
30
40
//pointer to vector after clear
29006928
0
33
0
//vector before clear
20
30
40
//vector after clear
**no output**

2 个答案:

答案 0 :(得分:2)

在调用delete ptr;时,您将取消分配为指针对象保留的内存。然后您执行pend = ptr->end();这肯定会引起未定义的行为,因为您所指向的地方没有std::vector<int>

最佳做法是在删除指针时将其值设置为 NULL 。因为删除时删除的是指向的对象,而不是指针的内容。因此,指针是 STILL 指向相同的内存位置。如果将其设置为NULL以防万一有人尝试再次使用它,他们会知道指针没有指向任何对象。

ptr = nullptr;

始终要记住在取消引用指针之前先进行NULL检查

答案 1 :(得分:0)

delete上调用ptr时,将破坏vector及其所有元素。

取消引用(即*ptrptr->)指针是未定义的行为。

删除对象后,它所指向的内存并不一定会消失(如果不再使用整个内存页,则可能无法再访问它),因此取消引用指针可能不会导致崩溃。在您的特定环境中,似乎内存不会立即被覆盖(某些环境会立即覆盖释放的内存,例如Visual Studio调试版本),保留了足够的向量内部状态,因此您的循环仍可以打印4个值(可能是容量)删除前的向量)。但是,您不能依赖此行为,它可以打印0个值,1000个值,崩溃或任何其他未定义的行为。