线程1:EXC_BAD_ACCESS (code=1, address=0x0)在vector insert上



我正在尝试使用。insert(<#const_iterator __position#>, <#const_reference __x#>)

这是我的代码:

高压泵:

typedef int elementType;
class Heap{
private:
    std::vector<elementType> myVecrtor;
    int mySize = 1; //The minimum size is 1 since the first element is a dummy.
    
public:
    Heap();
    void insert(elementType const item);
};

cpp:

void Heap::insert(elementType item){
    typename std::vector<elementType>::iterator it;
    for(int i = 0; i <= mySize; i++){
        it++;
    }
    myVecrtor.insert(it, item);
    mySize++;
}

在main中调用方法时:

#include <iostream>
#include "Heap.hpp"
int main(int argc, const char * argv[]) {
    Heap h;
    h.insert(10);
}

调试器让我成功运行,然后在矢量hpp文件中给我一个错误:

void __construct_backward_with_exception_guarantees(_Alloc&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) {
    ptrdiff_t _Np = __end1 - __begin1;
    __end2 -= _Np;
    if (_Np > 0)
        _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp));//The error is given here
}
error:Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

我不知道为什么我得到这个。如有任何帮助,不胜感激。

typename std::vector<elementType>::iterator it;

声明一个vector迭代器。正如您在这里看到的,它完全没有初始化。它没有初始化为任何值

    for(int i = 0; i <= mySize; i++){
        it++;
    }

并且该序列对迭代器进行未指定次数的递增。由于it没有初始化,这是未定义的行为。

    myVecrtor.insert(it, item);

尝试使用从未初始化过的迭代器向vector中插入某个内容,并且在未初始化之后,它将被递增(未指定的次数),这不会走得太远。

Heap的构造函数没有显示,因此不清楚它的构造函数是否以任何形式或方式初始化vector的内容。但这似乎不太可能,这个mySize似乎被初始化为1。因此,这个for循环将至少迭代一次,而且很可能不是一次,而是两次。

如果vector确实为空,那么即使正确初始化了it,其唯一可能的有效值也只能是begin()end()(两者对于一个完全空的vector都是等价的)。因此,对迭代器进行自增操作,即使已正确初始化,也是未定义的行为。

总而言之,所示代码中存在多个概念性缺陷:
  1. 所有迭代器都必须初始化,然后才能以递增、递减、解引用或任何其他方式使用。

  2. 对于完全空的vector对象,唯一可能有效的迭代器不能进行自增或自减操作。

  3. 如果insert()的目标是向vector添加一个新值,则不需要以任何形式或方式执行所示代码所做的操作。这是因为这恰好是std::vector自己的push_back()所做的!不需要迭代器,也不需要递增!

最新更新