C ++代码可以在台式机上正常运行,但不能在笔记本电脑上运行

时间:2020-06-24 08:32:46

标签: c++

出于某些原因,此简单代码在我的台式机上运行良好,但是当我在笔记本电脑上尝试该代码时,只有第一部分(打印矢量的元素)可以工作,然后程序结束,而不是说“进程以退出代码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;
}

4 个答案:

答案 0 :(得分:3)

这是由于迭代器无效而发生的,当您擦除向量的元素时,迭代器if __name__ == "__main__": # TMS configuration tmsIp = None tmsPort = None # Database configuration dbIp = None dbPort = None db_name = None db_user = None db_user_password = None ENVIRONMENT_DB_NAME = '' ENVIRONMENT_DB_USER = '' ENVIRONMENT_DB_PASSWORD = '' db_name = os.environ.get(ENVIRONMENT_DB_NAME) if db_name is None: raise Exception("Database name was not found in environment variables") db_user = os.environ.get(ENVIRONMENT_DB_USER) if db_user is None: raise Exception("Database user was not found in environment variables") db_user_password = os.environ.get(ENVIRONMENT_DB_PASSWORD) if db_user_password is None: raise Exception("Database password was not found in environment variables") parser = argparse.ArgumentParser() parser.add_argument("--tmsIp", help="TMS server IP used to run messaging server on") # Server port can be set using this parameter parser.add_argument("--tmsPort", help="TMS server port used to run the messaging server on") # Database IP parser.add_argument("--dbIp", help="Database ip") # Database Port parser.add_argument("--dbPort", help="Database port") # Display version parser.add_argument('--version', help="Displays the version of the module", action='store_true') args = parser.parse_args() if args.version is True: print(f'\n{MODULE_NAME} - {MODULE_VERSION}\n\n') exit() # Parameter settings (if applicable) if args.tmsIp is None: raise Exception(" Module cannot be started --tmsIp is missing") if args.tmsPort is None: raise Exception(" Module cannot be started --tmsPort is missing") if args.dbIp is None: raise Exception(" Module cannot be started --dbIp is missing") if args.dbPort is None: raise Exception(" Module cannot be started --dbPort is missing") tmsIp = str(args.tmsIp) tmsPort = int(args.tmsPort) dbIp = str(args.dbIp) dbPort = str(args.dbPort) # Loading settings file os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") # Loading database configuration from django.conf import settings settings.DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': db_name, 'USER': db_user, 'PASSWORD': db_user_password, 'HOST': dbIp, 'PORT': dbPort, } } # Migrate the database command = ['manage.py', 'migrate'] execute_from_command_line(command) # Load menu in the database curdir = os.path.dirname(__file__) location = os.path.join(curdir, "fixtures.json") command = ['manage.py', 'loaddata', location] execute_from_command_line(command) # Start on tmsIp:tmpsPort with 1 process command = ['manage.py', 'runserver', f'{tmsIp}:{tmsPort}', '--noreload'] execute_from_command_line(command) 会失效,从而导致未定义的行为,您可以在此处Iterator invalidation rules了解更多信息

答案 1 :(得分:3)

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

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++;
    }
}

答案 2 :(得分:2)

您的程序有未定义的行为,您递减了无效的迭代器

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

您可以通过删除具有“删除删除”模式的元素来避免这种情况

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);

答案 3 :(得分:1)

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