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