string的c_str导致的问题
由于有好多人只希望看代码,我就举点代码作为例子:
string content = "Hello, world!";
mbstowcs(wideContentBufferPointer, wideContentBufferLength, content.c_str(), content.length());
上面的content.c_str()会返回一个char*,也就是一个字符指针,指向一个内存区域,那个内存区域的长度为content.length() + 1,内容content这个字符串的内容后跟一个null。首先,主要的问题是:这个内存区域是不是就是content这个字符串类中包含的那个内容所占据的区域呢?我们可以理智的推断,不是。因为,一、那个区域比这个区域的大小小一。二、content类中内容未必在一个内存区域中。那么,这个内存区域就是c_str分配的了。可是,它在什么时候释放呢?不知道。没有办法知道这个char*会在什么时候释放。真是可怕啊。它不会被释放?这是一个内存泄漏吗?不……,好多人都会疯狂的,应该或许大概编译器会在适当的地方插入释放内存的指令吧。可是这是不可能的,这儿只有在运行时才能知道是不是可以释放了。这儿有GC吗?,应该没有。可是究竟怎么才能完成这个魔幻般的动作呢?有人会猜测,会不会实在string类的析构中释放?我觉得这仍然不可取,看看下面的代码:
char cons* f()
{
string r;
//....
return r.c_str();
}
这段代码会不会出现问题?应该不会吧。
如果会出现问题,那么,我们再看看这样:
//...
string* s = new string();
//...
char* data = 0;
if (condition)
data = s->c_str();
else
data = (char*)malloc(length + 1)
//...a lot of code use data
if (condition)
; //do nothing
else
{
free(data);
data = 0;
}
这儿会有双份的内存泄漏吗?
有人说了,c_str不会分配内存的,你上面的那些分析都不对了。可是问题是:如果c_str()不分配内存,它怎么能给内容最后缀上0?或许它内部就有结尾0?可是如果是这样,我们的string显然不能不是连续的,可是,标准上明确地写着它可以是不连续的。
我没有想到什么?谁给我解答一下。
相关推荐
c_str()的用法详细解析
c_str()就是把string类对象转换成和c兼容的char *类型。这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式
c++中c_str()的用法示例
//标准库的string类提供了三个成员函数来从一个string得到c类型的字符数组 //主要介绍c_str //c_str():生成一个const char*指针,指向以空字符终止的数组。 //这个数组应该是string类内部的数组 #include //需要包含cstring的字符串 #include using namespace std; int main() { //string-->char* //c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同 //这个数组的数据是临时的,当有一个改变这些数据的成员函数
C语言printf输出string[可运行源码]
本文详细介绍了在C语言中使用printf函数输出string类型字符串的方法。首先指出printf函数只能输出C语言的内置数据类型,而string不是内置类型。string对象不仅包含字符串,还包含操作函数,因此直接使用&str无法获取字符串首地址。正确的方法是使用string的成员函数c_str(),该函数返回字符串的首字符地址。文章通过错误示例和正确示例对比,展示了如何正确调用c_str()函数来输出string对象中的字符串内容。
C_string.h库文件
C_string.h库文件
C/C++中关于std::string的compare陷阱示例详解
主要给大家介绍了关于C/C++中关于std::string的compare陷阱的相关资料,文中先对C/C++中的std::string进行了简单的介绍,通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。


