无法访问向量中的整数

时间:2015-10-12 09:51:32

标签: c++ pointers iterator

以下程序遇到了分段错误,我无法理解原因。

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>();

如果需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:1)

好的,所以出了很多问题。专注于这个问题,看起来像:

  • projected_tids不是NULL(因为您已经完成了对cout的检查)
  • 然后,您的代码会转出projected_tids 指针的地址(位于堆栈上),而不是 vector 的地址。这没有什么不妥,但会有点误导。
  • 报告projected_tids包含16个元素
  • 然后当你查看第二项(at(1)使用0索引)时,它会出现故障(即无效使用指针)。这是一个有点错误的大提示。

看起来projected_tids不是有效的向量。无论将数据传递到A :: B方法是什么,都会以某种方式传入错误的指针。也许没有初始化?你说它被分配了,但也许它被删除了呢?

其他一些内容

  1. 如上所述,您在检查是否为NULL之前使用了projected_tids
  2. processed_input指针的全部内容是什么?
  3. 在任何地方都没有提及它
  4. 为什么不使用参考?它们更安全,并且与传递指针一样高效。

答案 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,则不要取消引用它。