繁体   English   中英

线程 1:向量插入上的 EXC_BAD_ACCESS(代码=1,地址=0x0)

[英]Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) on vector insert

我正在尝试使用 the.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++;
}

在主函数中调用方法时:

#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;

该语句声明了一个向量迭代器。 正如您在此处看到的,它完全未初始化。 它没有初始化为任何东西。

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

并且此序列将迭代器递增一些未指定的次数。 因为it没有被初始化,所以这是未定义的行为。

    myVecrtor.insert(it, item);

尝试使用从未初始化过的迭代器将某些内容插入到向量中,并且在未初始化后它会增加未指定的次数,不会达到 go 太远。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM