我是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