Я пытаюсь написать функцию для преобразования std :: string в 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);
В этом случае произошла утечка памяти. Первая выделенная строка недоступна, но ее ссылка потеряна.Поэтому я сделал то же самое, используя static:
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;
}
Но теперь проблема в том, что поля static char доступны:
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;
}
Проблема в том, что указатель char не совместим с указателем 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").Проблема все еще не решена.