检查有效指针

时间:2014-10-28 20:22:58

标签: c++ pointers

我有这个指针向量

std::vector<Connection *> List;

typedef struct {
    int Initialized;
....
} Connection;

我的程序是在这5行中的核心转储。可能是什么问题呢?

1 for ( size_t i = 0; i < List.size(); i++ ) { 
2       if ( List[i]->Initialized ) {
3           counter++ ;
4       }
5} /* for() */`  
  1. List[i]指向一些垃圾位置。因此,当您访问List [i] - &gt; Initialized时,它会进行核心转储。我可以在这里检查NULL以防止核心转储吗?我的理解是检查NULL将不起作用,因为指针可以指向垃圾并仍然有效。那么我可以在第2行之前添加一些检查,以防止核心转储吗?

  2. List.size()有一个巨大的数字,所以for循环永远不会结束?

  3. 我在这里错过了其他一些场景吗?我们不知道造成这个问题的原因,因此无法重现。出于某种原因,我无法在此系统上使用gdb或dbx。

2 个答案:

答案 0 :(得分:2)

  

那么我可以在第2行之前添加一些检查,以防止核心转储吗?

不,您无法检查指针是否有效。避免取消引用无效指针的方法是确保在代码中的每一点都已经知道哪些指针有效且哪些指针无效。这可能涉及以下几种组合:

  1. 首先不将无效指针插入容器
  2. 确保在此之前或之后立即从容器中删除任何无效的指针
  3.   

    List.size()有一个巨大的数字,所以for循环永远不会结束?

    这不会导致核心转储。

    另一种可能性是你的代码有一些未定义的行为,这样在输入循环之前List的内存就会被破坏。

    您可以使用gdb之类的调试器来检查核心文件,并确定导致核心转储的指令。

答案 1 :(得分:1)

可以使用构造函数集initialized将该特定底层数据结构初始化为适当的值。

通过智能指针定义存储指针捕获的容器:

std::vector < std::shared_ptr < Connection > > list

通过例如

完成向量的填充
list.push_back ( std::make_shared < Connection > ( /* arg1, arg2, ... */ );

最后,您可以简单地检查索引i的智能指针是否有效。

for ( ... )  {   
   if ( List[i] ) {
   }
}