2014-10-28 52 views
-3

我有一个指针的这个矢量检查有效的指针

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] - > Initialized时,它的核心转储。我可以在这里检查NULL以防止核心转储吗?我的理解是检查NULL将无法​​正常工作,因为指针可能指向垃圾并仍然有效。那么我可以在第2行之前添加一些检查以防止核心转储?

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

我在这里是否缺少一些其他场景?我们不知道是什么导致了这个问题,所以不能重现它。出于某种原因,我无法在此系统上使用gdb或dbx。

+0

如果你不能复制它,那么你为什么在意...... – luk32 2014-10-28 20:25:17

+2

你不能检查你不能建立的不变量。只有在你做了这些事情之后,才会依赖一些变量进行初始化。 – Deduplicator 2014-10-28 20:25:45

+5

gdb是你的朋友! – KRUKUSA 2014-10-28 20:26:23

回答

2

这样我就可以行2之前添加一些检查这里,为了防止核心转储?

不,你不能检查指针是否有效。避免引用无效指针的方法是确保在代码中的每个点上,您已知道知道哪些指针是有效的,哪些是无效的。这可能涉及的一些组合:

  1. 不插入无效指针到容器在第一位置
  2. 确保其成为无效任何指针从容器中取出之前或发生这种情况
后立即

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

这会不会导致核心转储。

另一种可能性是您的代码有一些未定义的行为,因此在输入循环之前List的内存已损坏。

您可以使用诸如gdb的调试器来检查核心文件并确定哪个指令导致核心转储。

+0

由于某些原因,我无法在此系统上使用调试器。 – user1549994 2014-10-28 20:42:33

1

一个可初始化与一个构造特定的底层数据结构中设置initialized为适当的值。

定义容器由智能指针存储指针捕获:

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

灌装矢量被完成,例如,

list.push_back (std::make_shared <Connection> (/* arg1, arg2, ... */); 

最后,你可以简单地检查是否有SMART-索引号i的指针是有效的。

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

如果List [i]'是一个未初始化的指针,这仍然可能会崩溃。 – cdhowie 2014-10-28 20:36:35

+0

@cdhowie你是对的,但我的回答是在问题完成之前。 – sfrehse 2014-10-28 20:38:33

相关问题