0

文字列への通常のポインタを取るメソッドがあります

void parseResponseData(char* response); 

そして私はこれを以下のように呼んでいます

parseResponseData((char *) response.c_str());  

レスポンスは std::string 型です。const char* を char* に変換するための最良の方法ではない可能性があり、次に、この場合メモリリークが発生している可能性があると思いますか? それについて専門家の意見が必要ですか?特に、これでメモリがリークしているかどうかを調べています。

4

3 に答える 3

3

あなたは本当にそのようにキャストすべきではありません。全体的に、c++ で c スタイルのキャストを行うことは避け、また const ネスを削除することは、ほとんど良い選択肢ではありません。const_castポインターの使用からconstを削除する必要がある場合は、それを避けるようにしてください。

string は引き続きメモリの所有権を取得するため、メモリはリークされません。

于 2013-01-10T16:32:44.600 に答える
2

あなたの質問は、明確に答えるのに十分な情報を提供していません。

parseResponseData入力文字列への非 const ポインタが必要なのはなぜですか? 文字列を変更しますか?std::stringその場合、直接使用することはできません。std::stringC スタイルの文字列として変更できるようにするインターフェイスは提供されません。これらの変更を保持する必要がない場合でも、 によって返されるバッファを変更することは違法std::string::c_str()です。

parseResponseDataが文字列を変更しない場合は、現在持っているものが機能するはずです (parseResponseData長期間使用するためにポインターを保存しようとしないと仮定します)。std::stringオブジェクトは によって返されたバッファの所有権を保持し、c_str()それを解放する責任があるため、ここではメモリ リークはありません。ただし、一部ではまだかなり醜いように見えます。parseResponseData変更しない操作の場合は、const char *.

于 2013-01-10T16:54:01.223 に答える
0

範囲外になるとresponse、基になる C 文字列が解放されます。への呼び出しは、C 文字列のコピーを作成parseResponseData()ず、ポインターのコピーのみを作成します。したがって、メモリリークはありません。

于 2013-01-10T16:32:58.950 に答える