1

自分では解決できない問題があります。

string filenameRaw;
filenameRaw= argv[1];
function(filenameRaw.c_str(),...);

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename)
...
this->IOPaths.rawData=rawDataFile;
...

これまでのところ非常にうまく機能します。今、変数 IOPaths.rawData に別の文字列を入れようとしています...

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename)
...
string filenameRaw;
filenameRaw=reader.Get("paths", "rawData", "UNKNOWN")
...
const char* rawDataFile1=filenameRaw.c_str();
cout << "Compare: " << strcmp(rawDataFile,rawDataFile1) <<endl;
...
this->IOPaths.rawData=rawDataFile1;

これはもう機能しません。私のプログラムの後半で、ファイル名にエラーが発生します。strcmp は間違いなく 0 を返すため、文字列は等しくなければなりません。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

3

の出力の有効性は、c_str()せいぜい、c_str()呼び出されたオブジェクトの存続期間に制限されます。1

this->IOPaths.rawData一度解放されたメモリを指してfilenameRawいるのは範囲外だと思います。

適切な解決策は、 std::string ではなく std::string を渡すことです[const] char*。適切な stl 実装では、文字列クラスにコピー オン ライト セマンティクスを使用するため、文字列データを繰り返しコピーすることはないでしょう。


1特定のインスタンス (オブジェクトが変更された場合など) では、それよりも少ない可能性があります。

于 2013-05-22T09:59:54.270 に答える