2014-10-28 87 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

相關問題