代码之家  ›  专栏  ›  技术社区  ›  Youssof. K.

线程1:vector insert上的EXC_BAD_访问(代码=1,地址=0x0)

  •  0
  • Youssof. K.  · 技术社区  · 2 年前

    我试图使用。插入(<#常数#迭代器#位置#>,<#常数#引用#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);
    }
    

    调试器让我成功运行,然后在vector 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)
    

    我不知道我为什么会得到这个。 任何帮助都将不胜感激。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Sam Varshavchik    2 年前
    typename std::vector<elementType>::iterator it;
    

    此语句声明一个向量迭代器。正如你在这里看到的,它完全没有注资。它没有初始化为任何内容。

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

    这个迭代器的一些未指定的递增次数。这 it 未初始化,这是未定义的行为。

        myVecrtor.insert(it, item);
    

    尝试使用从未初始化过的迭代器将某些内容插入向量,但在未初始化之后,该迭代器会以未指定的次数递增,这样做不会有太大的效果。

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

    如果向量确实是空的,那么如果 信息技术 如果已正确初始化,则其唯一可能的有效值为 begin() end() (对于一个完全空的向量,两者都是等价的)。因此,增加迭代器,即使它已正确初始化,也将是未定义的行为。

    总而言之,所示代码中存在多个概念性缺陷:

    1. 所有迭代器必须先初始化,然后才能以任何方式使用,递增或递减,取消引用,或以任何其他方式使用。

    2. 对于完全空的向量,唯一可能的有效迭代器不能递增或递减。

    3. 如果 insert 的目标是将一个新值附加到一个向量中,而不需要以任何形式或方式显示代码所做的任何事情。那是因为这恰好是 std::vector 他自己的 push_back() 做不需要迭代器,也不需要递增!