首页 > 解决方案 > 我收到此错误: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

标签: c++arraysvectorstlerase-remove-idiom

解决方案


这个循环:

for(int x : nums){

是使用迭代器在向量上循环的语法糖。

nums.erase(nums.begin() + i );

这使当前迭代器(以及当前元素右侧元素的迭代器)无效。使用迭代器,例如递增它会导致未定义的行为。

一旦到达循环体的末尾,当前迭代器就会递增。程序的行为是未定义的。


您需要做的是使用std::remove_if将剩余元素移动到向量的开头,然后使用接受一对迭代器的重载擦除末尾的元素(被移动的元素)。这称为擦除删除习语。


推荐阅读