C++与C不兼容:这种情况不能用std::string啦?
oracle oci中的有一部分函数的输出参数是char*型,但是std::string只能提供c_str()和data()函数,但它们返回的都是const类型,不能外部修改,所以我只好强制转换了,我用了一个例子以测试其成功与否,如
std::string str;
strcpy((char*)str.c_str(), "ABC ");//强制转换,修改内存
cout < <str < <endl;
居然输出正确,对string我没有更深的理解,不知道其是否安全?希望大家提出更好的解决办法!
[解决办法]
string s;
char *cstr = strdup (s.c_str());
// deal_with (cstr);
free (cstr);
[解决办法]
不能这么干的。
标准里面string的内存布局没有规定应该怎样。
你这样是依赖这样一个假设事实,string字符缓冲区是连续的,可惜事实不是这样的。
至少在vc下面, "ABC "这一串字符超过15个的时候,你已经破坏了string的结构了。
长度再长一些,你自己就可以看到你不可能得到正确结果了。
在15个字符以内的这种操作,只是刚好 "碰巧 "正确而已。
我们的程序不能依赖这种碰巧吧?
[解决办法]
如果楼主真的知道string的内存布局就好了
string至少有4种符合标准的实现
其中一个是copyonwrite的
另外一个是小于x字节的小字符串就直接在string类内存储而不另外再开内存间接存储。
[解决办法]
Meyes的建议是:这种情况下用vector <char> 代替string。待完成与c的交互操作后,再转换回string:
vector <char> v(size);
strcpy(&v[0], "abc "); //或者其他的c api交互操作
...
string str(v.begin(), v.end());