容器指针的自增
...
vector<string*> pstr;
vector<string*>::iterator iter = pstr.begin();
while(iter != pstr.end())
{
cout << **iter << "---" << (**iter++).size() <<endl;
}
这个代码段有错误 而且就是 (**iter++).size()这里
用(*iter++)->size();也不行
如果用(**iter).size();再加上一句 ++iter; 就能正确执行
但是这是为什么呢?
[解决办法]
因为cout << **iter << "---" << (**iter++).size() <<endl;
**iter和**iter++的运算顺序是不一致的。如果说iter++这个先运算。那么当iter++达到了end()时候 前面的**iter 就会运行崩溃。
[解决办法]
cout << **iter << "---" << (**iter++).size() <<endl;
///这是未定义行为.
因为 **iter 和 (**iter++).size()的执行顺序是不确定的.
所以当后者先执行时,那么在最后,iter 会指向 vector 的最后一个元素,那么前者再对iter 进行 * 操作,导致另一个未定义行为.
[解决办法]
为了不丢丑,仔细研究了下
主要问题是出在对于下面这段语句的计算顺序上
cout << **iter << /*"---" << */(**iter++).size() <<endl;
等价于
<<是操作符重载 也就等价于cout.operetor<<(**iter).operator<<((**iter++).size()).operator<<(endl);
C++执行时的入栈顺序是(**iter++).size()然后是(**iter),即第一个参数**iter入栈时此时iter的值已经进行了自加,所以iter此时可能是指向vector中end处,所以会发生错误
但此时在(**iter++).size()处所执行滴iter的值依旧是iter未自加前得副本,
附上测试代码
- C/C++ code
vector<const char **> pstrVec; const char *a[] = { "adas", "asdasd", "asdasdasdas" }; const char **p = a; pstrVec.push_back(a); pstrVec.push_back(a+1); vector<const char **>::iterator iter = pstrVec.begin(); while( iter != pstrVec.end() ) { cout << **iter << strlen(**iter++) << endl;//此时这里运行时会报错结果是asdasd 4 }