C++ Coding Standards 中提示用 string::c_str 与 C APIs 交互的问题.
由此帖中代码引发的思考,查看了一下 C++ Coding Standards by Herb Sutter, Andrei Alexandrescu
C++ Coding Standards Item 77 (P152)
They are compatible with C 's memory model: vector and string:: c_str CAN BE PASSED TO C APIs -- in both READ and WRITE modes, OF COURSE
这里专门有“Of Course”一说。但是与我印象中的说法有所冲突——似乎STL 不保证 c_str 指向的内存是可用的。而且,如果作为 WRITE mode 使用的话,晨星老大做了个实验,
string s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ";
strcpy(const_cast <char*> (s.c_str()), "b ");
cout < < s.length() < < endl;
输出32,“对象状态一致性遭破坏了。”
那么这里是二位大仙疏忽,还是 VC STL 有错,还是我们对 WRITE mode 的理解有误?
请先进指点。
[解决办法]
你在容器掌控之外改变它内部的对象的状态,不是自己找累么。就像std::map里的对象被外力野蛮地修改了一样,std::map本身是不会重新排序的嘛。