示例1:迭代器失效的情况
#include
#include
int main() {
std::vector nums = {1, 2, 3, 4, 5};
// 迭代器失效的情况
for (auto it = nums.begin(); it != nums.end(); ++it) {
if (*it == 3) {
nums.erase(it); // erase会使迭代器失效
}
}
// 输出结果
for (auto num : nums) {
std::cout << num << " ";
}
return 0;
}
解决方法:在迭代器失效之前,对迭代器进行更新,使其指向有效的元素。
for (auto it = nums.begin(); it != nums.end();) {
if (*it == 3) {
it = nums.erase(it); // erase返回下一个有效的迭代器
} else {
++it; // 更新迭代器
}
}
示例2:引用和指针失效的情况
#include
#include
int main() {
std::vector nums = {1, 2, 3, 4, 5};
int& ref = nums[2]; // 引用指向nums[2],假设其值为3
int* ptr = &nums[2]; // 指针指向nums[2]的地址
// 引用和指针失效的情况
nums.erase(nums.begin() + 2); // erase会导致nums[2]被删除,内存重新分配
// 输出结果
std::cout << ref << std::endl; // 引用失效,访问无效内存,结果未定义
std::cout << *ptr << std::endl; // 指针失效,访问无效内存,结果未定义
return 0;
}
解决方法:在引用和指针失效之前,更新引用和指针的指向。
int& ref = nums[2];
int* ptr = &nums[2];
nums.erase(nums.begin() + 2);
// 更新引用和指针的指向
ref = nums[2];
ptr = &nums[2];