为何vector中的裸指针置为nullptr后,原指针未同步变为nullptr?
问题原因分析
核心问题在于你在范围for循环里操作的是指针的副本,而非vector内的原指针,更和最初的intPtr没关系:
- 当你写
for(auto* ptr : ptrVec)时,每次循环都会把vector里的指针值拷贝一份给变量ptr。这时候ptr、vector里的元素、intPtr是三个独立的变量,只是它们保存的内存地址值相同。 - 你在循环里把
ptr设为nullptr,只是修改了这个副本的内容,完全不会影响vector里的原指针,自然也不会改变最初的intPtr。 - 哪怕你执行了
delete ptr释放了内存,vector里的元素和intPtr依然存着原来的地址,只是这个地址已经变成了野指针。
修正方案
如果想修改vector里的指针,需要用引用遍历,让ptr成为vector元素的别名;如果还要让intPtr也变成nullptr,得单独给它赋值:
#include <vector> #include <cstdio> int main(void) { int* intPtr = new int(1); printf("%p\n", intPtr); //(a) std::vector<int*> ptrVec; ptrVec.push_back(intPtr); // 使用引用操作vector内的原指针 for(auto*& ptr : ptrVec) { delete ptr; ptr = nullptr; printf("%p\n", ptr); // (b) =>(nil) } // 单独修改intPtr intPtr = nullptr; printf("%p\n", intPtr); //(c) =>(nil) }
内容的提问来源于stack exchange,提问作者sparrow
相关产品推荐
相关产品推荐

