2012-01-14 52 views
4

我故意做迭代超過std::vector一樣大小,界檢查迭代器在Release模式(C++)

for (std::vector <Face>::iterator f = face.begin(); 
      f!=face.end()+5; 
       ++f) 
{ 
    // here I try to access (*f).P 
    // note that I added 5 to the face.end() 
} 

我沒有既不在編譯過程中遇到任何錯誤和運行時間。我怎樣才能防止呢?

+4

只是不這樣做?至於檢測,搜索*檢查迭代器*。 – 2012-01-14 18:40:20

+2

由於需要運行時性能,調試版本通常會捕獲我使用Release的 – pezcode 2012-01-14 18:49:52

+0

。 – Shibli 2012-01-14 18:54:49

回答

4

如果您要檢查的訪問vector元素,你可以使用at函數拋出邊界破壞的情況下,std::out_of_range例外。例如:

for (std::vector<Face>::size_type i = 0; 
      i != face.size()+5; 
       ++i) 
{ 
    face.at(i).f(); 
} 

該標準沒有指定任何檢查的迭代器。標準中的措辭是訪問無效的迭代器會導致未定義的行爲。但是許多實現提供了checked迭代器。如果可移植性不是問題,則可以使用其中一個檢查過的迭代器。例如,在MSVC調試模式下,vector<T>::iterator是一個檢查迭代器。然而,在發佈模式下,它只是一個typedef T*

+0

你可以在我的代碼上應用'at'作爲示例 – Shibli 2012-01-14 18:56:29

+0

@Shibli:請參閱我的編輯 – 2012-01-14 19:04:10

+0

在調試模式下,它會在不使用'at'的情況下發現錯誤。由於我不明白你的最後一句話,在釋放模式下,我應該使用'at'進行檢查嗎? – Shibli 2012-01-14 19:13:52

1

您使用的是什麼C++編譯器? VC10(即下在VS2010 ++編譯器)在調試生成正確地識別這些問題:

// Compile with: 
// cl /EHsc /W4 /nologo /D_DEBUG /MDd test.cpp 


#include <iostream> 
#include <string> 
#include <vector> 


class Face 
{ 
public: 
    std::string Name; 

    explicit Face(const std::string & name) 
     : Name(name) 
    {} 
}; 


int main() 
{ 
    std::vector<Face> faces; 
    faces.push_back(Face("Connie")); 
    faces.push_back(Face("John")); 

    for (
     std::vector <Face>::iterator f = faces.begin(); 
     f != faces.end() + 5; 
     ++f) 
    { 
     std::cout << f->Name << std::endl; 
    } 

    return 0; 
} 

當執行所得到的.exe,一個錯誤對話框顯示與以下錯誤消息:

表達:向量的迭代器+偏移超出範圍

+0

它在調試模式下在運行時給出了相同的錯誤。謝謝。 – Shibli 2012-01-14 19:07:30

+0

@Shibli:不客氣。 MS Visual C++附帶的STL實現非常適合用於調試迭代器和調試迭代​​器支持的調試目的。 – 2012-01-14 22:26:13

0

標準C++庫的發行版,你將不會集結在邊界上的檢查迭代器(或其他可能未被檢查的操作),因爲它會比較慢。但是,這並不意味着您需要在調試模式下進行編譯:就我所瞭解的libstdC++調試模式而言,可以在編譯優化開啓編譯時使用它。我懷疑這對於其他檢查過的STL實現是如此,因爲檢查代碼通常是通過適當地設置一些宏來指導的。要做到這一點,你需要找到適當的宏設置,並用你用來構建代碼的任何東西來適當地設置它們。