使用向量迭代器时的 EXC_BAD_ACCESS?

Posted

技术标签:

【中文标题】使用向量迭代器时的 EXC_BAD_ACCESS?【英文标题】:EXC_BAD_ACCESS when using vector iterators? 【发布时间】:2013-03-31 05:59:43 【问题描述】:

我有一个用户定义类型的向量(矩阵)向量,my_type,它是一个结构体,包含整数 a、b 和 c。我希望定义一个函数,通过 b 的值查找该矩阵的元素并删除该元素。由于该函数不知道c的值,所以我定义了一个迭代器it首先找到这个元素,然后将它的指针地址设置为迭代器it_found,这样就可以在erase()方法中使用了。但是,当使用it_found 时,程序产生了一个错误Program received signal EXC_BAD_ACCESS, Could not access memory,。是什么导致了这个错误?

bool remove_V(int a, int b) 
    typename std::vector<my_type>::iterator it;  
    typename std::vector<my_type>::iterator it_found;  


        for(it = V.at(a).begin(); it != V.at(a).end(); ++it)
            if ((*it).b ==  1) 
                it_found == it;
                std::cerr << (*it).b << "\n";
                std::cerr << (*it_found).b << "\n";
                
        

【问题讨论】:

假设 g++,您应该尝试使用选项-Wall -Wextra -Werror 进行编译。如果是 MSVC,则有可比较的标志。但是,编译器可能已经警告您该语句无效。我不确定它会不会,但这仍然是一个很好的实践。 【参考方案1】:

我认为:

it_found == it;
        ^^^^

应该是:

it_found = it;
        ^^^

否则,您将取消引用不指向任何有效内容的迭代器。 此外,您可能希望使用 Remove-Erase Idiom

【讨论】:

【参考方案2】:

您没有将it_found 初始化为任何值,因此(*it_found) 正在引发错误。我想你的意思是:

it_found = it;

而不是

it_found == it;

【讨论】:

以上是关于使用向量迭代器时的 EXC_BAD_ACCESS?的主要内容,如果未能解决你的问题,请参考以下文章

使用refs实现迭代器时的生命周期推断问题

使用异步请求时的 exc_bad_access

使用 AFNetworking 2.0 进行 POST 时的 EXC_BAD_ACCESS

在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS

执行 segue 时的 EXC_BAD_ACCESS(code 1, address=0x1)

在 Swift 中使用泛型、协议和继承创建对象时的 EXC_BAD_ACCESS