以下程序遇到了分段错误,我无法理解原因。
vector<int> *A::B(vector<int> *prefix, vector<int> *projected_tids, int support) {
vector<int> *result = NULL;
for(it_vec it = projected_tids->begin(); it != projected_tids->end(); ++it) {
if(projected_tids == NULL) {
cout<<"NULL";
} else {
cout<<"abc"<<endl;
cout<<&projected_tids<<"address"<<endl;
}
cout<<"here"<<projected_tids->size()<<" "<<prefix->size()<<endl;
cout<<"iteration: "<<projected_tids->at(1)<<endl; //seg fault here
map<int, bool> *transaction = (*processed_input)[*it]; //seg fault here as well, because of *it
bool found = true;
//some more code
}
}
提示符如下所示:
abc
0x7ffe3894a198address
here16 1
Segmentation fault (core dumped)
GDB也令人困惑,可能是因为我很长一段时间后都在使用C ++,但我无法理解为什么?下面是GDB输出:
(gdb) print projected_tids == (void *)0
$14 = false
(gdb) print *(projected_tids._M_impl._M_start)@1
Cannot access memory at address 0x0
(gdb) print *(projected_tids._M_impl._M_start)@3
Cannot access memory at address 0x0
(gdb) print projected_tids
$15 = (std::vector<int, std::allocator<int> > *) 0x60e000
指向vector的指针的分配与调用类一样:
vector<int> *projected_tids = new vector<int>();
如果需要更多信息,请与我们联系。
答案 0 :(得分:1)
好的,所以出了很多问题。专注于这个问题,看起来像:
projected_tids
不是NULL
(因为您已经完成了对cout的检查)projected_tids
指针的地址(位于堆栈上),而不是 vector 的地址。这没有什么不妥,但会有点误导。projected_tids
包含16个元素at(1)
使用0索引)时,它会出现故障(即无效使用指针)。这是一个有点错误的大提示。看起来projected_tids
不是有效的向量。无论将数据传递到A :: B方法是什么,都会以某种方式传入错误的指针。也许没有初始化?你说它被分配了,但也许它被删除了呢?
其他一些内容
答案 1 :(得分:0)
您已经在指向对象的指针上调用成员函数,而不先检查NULL:
for(it_vec it = projected_tids->begin(); it != projected_tids->end(); ++it) {
^^^^^^^^^^^^^^^^^^^^^^^
unconditional call to member function
if(projected_tids == NULL) {
^^^^^^^^^^^^^^^^^^^^^^^^^^
Only here you test for NULL or not
所以程序中的逻辑是有缺陷的(大时间),任何事情都可能发生。
此外,如果不检查大小是否至少为2,则无法使用->at(1)
。在您的示例中,向量的大小为0.
顺便说一下:为什么不通过引用传递向量?
答案 2 :(得分:-1)
逻辑似乎不正确。
if(projected_tids == NULL) {
cout<<"NULL";
} else {
检查是否为null。如果为null,则打印null,然后继续取消引用。
cout<<"iteration: "<<projected_tids->at(1)<<endl;
如果为NULL,则不要取消引用它。