?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
我们知道QstringcMؓ我们提供了很多的便利Q我们用stringc能方便的做字符串的各种操作Q避免了我们直接操作char指针而生的一些繁琐的操作Q和内存泄露的可能性,可是stringcM是有陷阱的。下面我们看q样一个例子,你能看出问题所在吗Q?/strong>
复制代码
string getString()
{
return "just a test";
}
void test()
{
const char *pc = getString().c_str();
cout<<pc<<endl;
}
复制代码
如果看不出来可以实际q行一下,会发现输不出l果来,q是Z么呢Q?/p>
当我们写getString函数Ӟ如果其返回类型是const char*我们可能会分外小心,因ؓ我们知道"just a test"生命会在函数q回后结束,我们可能会new一D늩间来放这个字W串Q然后返回指针,或者是要求调用者给一个空间来放这个字W串。但是当q回cd是stringӞ我们׃会如此小心翼|因ؓ我们知道stringcdC拯构造函数和赋值函数。它会ؓ我们操心I间分配和销毁的问题。所以在q里Q我们直接返?quot;just a test"字符串是没有问题的?/strong>
接着我们对一个string对象调用c_str函数貌似也没有什么问题,因ؓq是stringcL供给我们的功能。但是这里的关键是,我们没有getString()的结果赋l一个string对象q接获取其指针了,q时Q系lƈ不会为string调用拯构造函数或是赋值函敎ͼq回的string仍然只是一个时对象的状态,它会在完成对pc的赋值后被销毁,q时其内部的数据也不会存在了?/strong>
怎么解决q个问题呢?
我们要改变c_str函数Q让它不要直接返回指针,而是new一D늩间来放这个字W串再返回指针吗Q这P会降低效率,且每个调用c_str函数的用户都需要操心delete指针的问题,很容易造成内存泄露?/p>
我们要改写getString函数Q重Cؓq回的字W串new一D늩间吗Q这么做昄也不合适?/p>
q时Q我们有两种比较可行的解x法?/p>
1.不要直接q回临时对象的指针,时对象先赋值给一个局部对象,再获取其指针?/strong>q样Q将上例改写?/p> void test() { string str = getString(); const char *pc = str.c_str(); cout<<pc<<endl; } 2.如果要用时对象的指针Q将所有的使用攑ֈ一个语句里q行?/strong>q样Q将上例改写?/p> void test() { cout<<getString().c_str()<<endl; }