我的代码是
//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**
答案 0 :(得分:2)
在调用delete ptr;
时,您将取消分配为指针对象保留的内存。然后您执行pend = ptr->end();
这肯定会引起未定义的行为,因为您所指向的地方没有std::vector<int>
。
最佳做法是在删除指针时将其值设置为 NULL 。因为删除时删除的是指向的对象,而不是指针的内容。因此,指针是 STILL 指向相同的内存位置。如果将其设置为NULL以防万一有人尝试再次使用它,他们会知道指针没有指向任何对象。
ptr = nullptr;
始终要记住在取消引用指针之前先进行NULL检查
答案 1 :(得分:0)
在delete
上调用ptr
时,将破坏vector
及其所有元素。
取消引用(即*ptr
或ptr->
)指针是未定义的行为。
删除对象后,它所指向的内存并不一定会消失(如果不再使用整个内存页,则可能无法再访问它),因此取消引用指针可能不会导致崩溃。在您的特定环境中,似乎内存不会立即被覆盖(某些环境会立即覆盖释放的内存,例如Visual Studio调试版本),保留了足够的向量内部状态,因此您的循环仍可以打印4个值(可能是容量)删除前的向量)。但是,您不能依赖此行为,它可以打印0个值,1000个值,崩溃或任何其他未定义的行为。