线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)向量插入
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) on vector insert
我正在尝试使用 .insert(<#const_iterator __position#>, <#const_reference __x#>) 将元素插入向量中
这是我的代码:
hpp:
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;
这条语句声明了一个向量迭代器。正如您在此处看到的,它完全未初始化。它没有被初始化为任何东西。
for(int i = 0; i <= mySize; i++){
it++;
}
并且此序列将迭代器递增一些未指定的次数。由于 it
未初始化,这是未定义的行为。
myVecrtor.insert(it, item);
尝试使用从未初始化过的迭代器将某些内容插入到向量中,并且在 not-initialized 之后它会增加未指定的次数,不会走得太远。
Heap
的构造函数未显示,因此不清楚其构造函数是否以任何形式或方式初始化向量的内容。但这似乎不太可能,而且这个 mySize
似乎被初始化为 1。因此这个 for
循环将至少迭代一次,而且很可能不是一次而是两次。
如果向量确实为空,那么即使 it
被正确初始化,它唯一可能的有效值将是 begin()
或 end()
(两者都等同于一个完全空的向量)。因此,增加迭代器,即使它被正确初始化,也将是未定义的行为。
总而言之,所示代码中存在多个概念缺陷:
所有迭代器必须先初始化,然后才能以任何方式使用,递增或递减,解除引用或任何其他方式。
完全空向量的唯一可能有效迭代器不能递增或递减。
如果 insert()
的目标是将新值附加到矢量,则不需要以任何形式或方式显示的代码正在执行的操作。那是因为这恰好正是 std::vector
自己的 push_back()
所做的!不需要迭代器或递增!
我正在尝试使用 .insert(<#const_iterator __position#>, <#const_reference __x#>) 将元素插入向量中
这是我的代码:
hpp:
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;
这条语句声明了一个向量迭代器。正如您在此处看到的,它完全未初始化。它没有被初始化为任何东西。
for(int i = 0; i <= mySize; i++){
it++;
}
并且此序列将迭代器递增一些未指定的次数。由于 it
未初始化,这是未定义的行为。
myVecrtor.insert(it, item);
尝试使用从未初始化过的迭代器将某些内容插入到向量中,并且在 not-initialized 之后它会增加未指定的次数,不会走得太远。
Heap
的构造函数未显示,因此不清楚其构造函数是否以任何形式或方式初始化向量的内容。但这似乎不太可能,而且这个 mySize
似乎被初始化为 1。因此这个 for
循环将至少迭代一次,而且很可能不是一次而是两次。
如果向量确实为空,那么即使 it
被正确初始化,它唯一可能的有效值将是 begin()
或 end()
(两者都等同于一个完全空的向量)。因此,增加迭代器,即使它被正确初始化,也将是未定义的行为。
总而言之,所示代码中存在多个概念缺陷:
所有迭代器必须先初始化,然后才能以任何方式使用,递增或递减,解除引用或任何其他方式。
完全空向量的唯一可能有效迭代器不能递增或递减。
如果
insert()
的目标是将新值附加到矢量,则不需要以任何形式或方式显示的代码正在执行的操作。那是因为这恰好正是std::vector
自己的push_back()
所做的!不需要迭代器或递增!