繁体   English   中英

C++ 代码在台式机上运行良好,但在笔记本电脑上却不行

[英]C++ code works fine on desktop but not on the laptop

出于某种原因,这个简单的代码在我的桌面上运行得非常好,但是当我在我的笔记本电脑上尝试它时,只有第一部分(打印向量的元素)可以工作,然后程序结束,而不是说“进程完成,退出代码 0”它说
“进程以退出代码 -1073741819 (0xC0000005) 结束”。 我不知道我的笔记本电脑出了什么问题。 谁能帮我?

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> array{1, 2, 3, 4, 5};
    vector<int>::iterator it;
    int arraysize;
    for (int i = 0; i < array.size(); i++) {
    cout << array[i] << endl;
    }
    cout << " " << endl;

    for (it = array.begin(); it < array.end(); it++) {
        if(*it%2==0){
            array.erase(it);
            it--;
        }
    }
    arraysize=array.size();
    cout<<"size:"<<arraysize<<endl;
    for (int i = 0; i < array.size(); i++) {
        cout << array[i] << endl;
    }



    return 0;
}

发生这种情况是因为迭代器失效,当您擦除向量的一个元素时,迭代器it失效导致未定义的行为,您可以在此处阅读更多有关此迭代器失效规则的信息

问题不在于计算机,而在于代码。

array.erase(it); 使迭代器it无效,并且任何后续使用它都有未定义的行为。
最糟糕的一种未定义行为是看起来有效的行为。

erase将一个迭代器返回到擦除后的元素,您应该使用它。

for (it = array.begin(); it < array.end(); it++) {
    if(*it%2==0){
        it = array.erase(it);
        it--;
    }
}

或者

it = array.begin(); 
while (it < array.end()) {
    if(*it%2==0){
        it = array.erase(it);
    }
    else {
        it++;
    }
}

你的程序有未定义的行为,你减少了一个无效的迭代器

array.erase(it); // it becomes invalid
it--; // Undefined

您可以通过使用“erase-remove”模式删除元素来避免这种情况

auto is_even = [](int i) { return i%2==0; };
array.erase(std::remove_if(array.begin(), array.end(), is_even), array.end());

或者在 C++20 中

std::erase_if(array, is_even);

你的笔记本电脑没有问题。 问题出在代码上。 当您从向量中擦除某些内容时,它会使擦除元素之后的先前存在的迭代器无效。 您可能希望使用erase的返回值,它引用已擦除元素的后继元素的新重新分配位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM