0

これは私の簡単なプログラムの一部です

string appData = getenv("APPDATA");
const char *mypath= (appData+"\\MyApplication\\hello.txt").c_str();      
cout << mypath;  
// output: c:\users\xrobot\appdata\Roaming\Myapplication\hello.txt   
fstream file(mypath,ios::in);
ofstream filetemp;    
filetemp.open("world.bak");
cout << mypath;  
// output: É↕7

その奇妙な文字列でmypathが変更されるのはなぜですか?

4

3 に答える 3

7

次のように使用する必要がありますstd::string

std::string appData = getenv("APPDATA");
std::string path = appData+"\\MyApplication\\hello.txt";

次にこれを行います:

const char * mypath = path.c_str();

これを行ってはならないことに注意してください。

const char* mypath = (appData+"\\MyApplication\\hello.txt").c_str();

これは、右側の式が一時的なものであり、式の最後で破棄され、mypath破棄されたオブジェクトを指し続けるためです。つまり、ダングリング ポインターになります。

--

その奇妙な文字列で mypath が変更されるのはなぜですか?

投稿されたコードでmypathは、未定義の動作を呼び出すダングリング ポインターであるためです。

コードの書き方は次のとおりです。

std::string appData = getenv("APPDATA");
std::string mypath= appData+"\\MyApplication\\hello.txt";
cout << mypath;  
fstream file(mypath.c_str(),ios::in);
于 2012-04-20T16:15:08.957 に答える
5

このように 2 つの文字列を追加することはできません。明確な警告が表示されるはずです。C++ を使用しているため、std::string代わりに使用することをお勧めします。

于 2012-04-20T16:14:32.837 に答える
2

これは単なる一時的なものstd::stringです:

(appData+"\\MyApplication\\hello.txt")

したがって、式が使用された後、基になる C 文字列スペースを解放できます。char*現在ガベージメモリになっているものを指しているので、ファンキーな値があります。

于 2012-04-20T16:15:52.890 に答える