我是GCC的忠實粉絲,但最近我發現了一個模糊的異常。使用__gnu_cxx :: __ normal_iterator(即libstdC++中使用的最常用的迭代器類型,即C++ STL),可以引用任意內存位置,甚至可以更改其值,而不會導致異常!這是預期的行爲?如果是這樣,是不是安全漏洞?使用C++迭代器引用無效的內存位置
下面是一個例子:
#include <iostream>
using namespace std;
int main() {
basic_string<char> str("Hello world!");
basic_string<char>::iterator iter = str.end();
iter += str.capacity() + 99999;
*iter = 'x';
cout << "Value: " << *iter << endl;
}
@David:感謝您的解釋;這是精確的,正是我所期待的。我目前正在改進我的代碼庫。我知道'g ++'分配的任何字符串總是以'EOF','WEOF'或者至少是'CharType()'結尾(即分配內存的最後一個單元被分配給它)。那麼你認爲在這種情況下使用調試斷言是個好主意嗎?你有什麼其他的建議? – themoondothshine 2010-04-02 16:25:39
你是指字符串文字還是'std :: string'實例?字符串文字「asdf」總是以「(char)0」結尾。使用'std :: string'不能保證任何給定點處的內存內容。請注意,作爲一個例子,在g ++ 4.4和空字符串中沒有分配內存,所以肯定不是EOF/WEOF/0終止。 – 2010-04-02 17:12:49
我指的是'std :: string'。是的,你對g ++ 44空字符串是正確的:它持有一個指向(靜態)共享空空指針的指針。但是,假設如果我在非空std :: string上使用迭代器,我可以假設它始終以EOF/WEOF/0結束?g ++ 44跟隨'traits_type :: assign(this - > _ M_refdata()[__ n],_S_terminal)的stirng分配;''不是嗎? – themoondothshine 2010-04-02 17:30:49