2016-11-24 4 views
0

私は以下のコードに問題があります。私は使用しているIDEによって異なる動作を経験しています。const char *をfile.open()に渡すと、異常な動作

のDev-C++:実行します罰金。ただし、GenerateFileName(0,0)file.open()に渡すと、ファイルは作成されません。

のVisual Studio 2013:すべてのケースで罰金実行しますが、しかし、ファイルの名前は

ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌPùD 

またはそのような何かのようなルックスを生成し、ファイル自体は(私は.txtを期待拡張子がありませんファイル)。

int main() 
{ 
    ofstream file; 
    file.open(GenerateFileName(3, 0)); 
    file << 1 << endl; 
    file.close(); 
    _getch(); 
} 

const char* GenerateFileName(int Instance_nth, int Input_nth) 
{ 
    string filename = to_string(Instance_nth); 
    filename += "_"; 
    filename += to_string(Input_nth); 
    filename += ".txt"; 

    return filename.c_str(); 
} 
+3

をGenerateFileName 'で()'変数 'filename'は、関数が戻るときに破壊されます関数の戻り値はゴミです。 – Leon

+2

ローカル変数へのポインタを返しています。それがUBです。 –

+2

関数から文字列を返すだけです – Borgleader

答えて

4
const char* GenerateFileName(int Instance_nth, int Input_nth) 
{ 
    string filename = to_string(Instance_nth); 
    filename += "_"; 
    filename += to_string(Input_nth); 
    filename += ".txt"; 

    return filename.c_str(); 
} 

あなたが内部的にfilenameによって保存されたデータへのポインタを返すしているようなものをGenerateFileNameからstd::stringを返却して行うことです:返されます値はダングリングポインタであり、コードは未定義の動作です。

は何がstd::string代わりconst char*の返却され行うことができますになるだろう

std::string GenerateFileName(int Instance_nth, int Input_nth) 
{ 
    string filename = to_string(Instance_nth); 
    filename += "_"; 
    filename += to_string(Input_nth); 
    filename += ".txt"; 

    return filename; 
} 

使用法:

file.open(GenerateFileName(3, 0).c_str()); 
+0

ありがとうございます。しかし、私はまだDev C++上でコードがうまく動いているのだろうと思っています(ただし、GenerateFileName(0、0)をfile.open()に渡すシナリオを除く)。 –

+3

未定義の動作=確実に正常に動作することは期待できませんが、確実にクラッシュすることは期待できません。あなたのコードはいくつかのコンパイラのいくつかのバージョンで正常に動作するかもしれません - あなたのバージョンのDev C++の背後にあるコンパイラのように見えますが、異なるコンパイラや異なるコンパイラバージョン – wasthishelpful

1

filenameが破壊されているので、あなたがGenenerateFileName機能を離れると、これは、未定義の動作である、とfile.openはすでに変数データを破壊するために指しているポインタを、受信しています。ここ

最も簡単な方法は、それがGenerateFileNameさんが終わると破壊されながらfile.open(GenerateFileName(0,0).c_str());

関連する問題