c++ - 我收到此错误:AddressSanitizer:negative-size-param: (size=-8)
问题描述
从给定数组中删除给定元素时,我不断收到错误消息。
这是我的代码,我不确定我的错误在哪里:
int removeElement(vector<int>& nums, int val) {
int i=0;
int size=nums.size();
if(size <=0){
return 0;
}
for(int x : nums){
if(x==val){
nums.erase(nums.begin() + i );
}
i=i+1;
}
int size1=nums.size();
return size1;
}
然后我收到此错误:
=================================================================
==33==ERROR: AddressSanitizer: negative-size-param: (size=-8)
#8 0x7f3d479c882f (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
0x603000000060 is located 0 bytes to the right of 32-byte region [0x603000000040,0x603000000060)
allocated by thread T0 here:
#6 0x7f3d479c882f (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
==33==ABORTING
解决方案
这个循环:
for(int x : nums){
是使用迭代器在向量上循环的语法糖。
nums.erase(nums.begin() + i );
这使当前迭代器(以及当前元素右侧元素的迭代器)无效。使用迭代器,例如递增它会导致未定义的行为。
一旦到达循环体的末尾,当前迭代器就会递增。程序的行为是未定义的。
您需要做的是使用std::remove_if
将剩余元素移动到向量的开头,然后使用接受一对迭代器的重载擦除末尾的元素(被移动的元素)。这称为擦除删除习语。
推荐阅读
- web-services - Google Place API 为两个同名的不同地点返回同一个地点
- node.js - 从 openHAB-cloud 连接到 mongodb 时出错:MongoError: Authentication failed
- php - 通知门面发送静态方法捕获异常
- salesforce - 用于 Salesforce 的 Gmail 插件
- javascript - Object.keys(anObject) 是否返回 anObject 的原型?
- php - 为什么在布尔类型上转换 bool 总是返回 false
- typescript - 在使用 let 或其他方式在 TypeScript 中定义属性时,定义其类型的最佳实践或规则是什么?
- ibm-doors - 如何将图像插入到 DOORS 属性中
- git - 如何在更新/合并历史记录时执行 Git 合并
- reactjs - Child(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null