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型のフィールドがアクセス可能であることである: は、だから私は、静的な使用して同じにする
char* cstr;
string str("hello");
cstr=$(str);
$(str)[5]='!';
これはpossibileで、第六文字が変更され、これもCされますcstrが指す文字列が変更されます。
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);
をしかし、私は唯一使用できるのconstを使用して
const charポインタ 私は、戻り値が右のオペランドとしてしか置かれるが、代入の左のオペランドには配置されない関数を持つことです。これはどのように行うことができますか?
私はこれを実行しようとしました:
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"を出力します)。 問題はまだ解決されません。
あなたは '$'という関数を書いていますか? –
"この場合、メモリリークがあります。最初に割り当てられた文字列には到達できませんが、参照は失われています。"あなたの関数は、クライアントコードを馬鹿から保護することはできません。あなたが 'std :: string'を使ってリークから保護したいのであれば、' char * 'を使って作業すれば、気をつけなければ漏れるかもしれません。唯一の解決策は、スマートポインタを 'char *'に返すことです(特に、配列の場合は 'delete []'ではなく 'delete'を呼び出します)。 –
'cstr'で何をしたいですか?たぶん、あなたの問題はより巧妙な方法で解決できるでしょう。たとえば、const_cast 'を使って' str.c_str() 'から' const'を削除しますか? –
jofel