我正在嘗試編寫一個函數將std :: string轉換爲char *。 我寫的第一個是這樣的:將字符串轉換爲char *
char* $ (string str)
{
char* cstr;
const unsigned int length=str.size();
cstr=new char[1000];
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}
但問題是內存泄漏:讓我們假設我這樣做:
char* cstr;
string str1("hello"),str2("hello2");
cstr=$(str1);
cstr=$(str2);
有這case.The內存泄漏第一分配的字符串不可訪問,但它的引用丟失。 所以我使用靜態由相同:
char* $ (string str)
{
static char cstr[1000];
const unsigned int length=str.size();
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}
但現在的問題是,靜態字符字段是可訪問:
char* cstr;
string str("hello");
cstr=$(str);
$(str)[5]='!';
這是不可能性,第6個字符被修改,因此也是C由cstr指定的字符串被修改。
中使用const:
const char* $ (string str)
{
static char cstr[1000];
const unsigned int length=str.size();
for(int i=0;i<length;i++)
cstr[i]=str[i];
cstr[length]=0;
return cstr;
}
的問題是一個字符指針是不是一個const char指針兼容,所以我不能做到這一點:
string str("hello");
char* cstr;
cstr=$(str);
但我只能用一個常量字符指針。 我會做的是有一個函數,它的返回值只能作爲右操作數,而不能作爲賦值的左操作數。如何完成?
我試着這樣做:
char* toCharArray(string& str)
{
std::unique_ptr<char>p(new char[1000]);
char* temp=p.get();
for(unsigned int i=0;i<str.size();i++)
{
*temp=str[i];
temp++;
}
return p.get();
}
但問題仍然存在,我不認爲這與其他解決方案之間的差別我張貼使用static.Since一個這樣的代碼:
char* cstr;
string str("hello");
cstr=toCharArray(str);
toCharArray(str)[0]='o';
cout << cstr;
修改字符串(打印「oello」)。 問題仍未解決。
你已經寫了一個名爲'$'的函數? – 2012-02-23 12:48:03
「在這種情況下存在內存泄漏。第一個分配的字符串不可訪問,但它的引用已丟失。」您的功能無法保護客戶端代碼不被視爲白癡。如果你想防止泄漏,你使用'std :: string',如果你使用'char *',你知道如果你不小心你可能會泄漏。唯一的另一種解決方案是將一個智能指針返回給char *(特別是一個數組,否則它將調用delete而不是delete [])。 – 2012-02-23 12:53:52
你想用'cstr'做什麼?也許你的問題可以用更聰明的方式解決。例如使用const_cast'從'str.c_str()'中移除'const'? –
jofel
2012-02-23 13:04:59