2016-04-22 29 views
1

Windowsのmingwでコンパイルしていて、gdbを使用してアプリケーションをデバッグしています。ディスクからファイルを読み込もうとしたとき、私はこの出力を取得しています:ファイルの読み込みに奇妙なエラーが発生しました

processfile (type=35633, 
source=0xec4d6c "î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_î_"...) at main.cpp:5 

ここに私の読み取りファイル機能である:ここで

const char* read_file_contents(const char* filename) 
{ 
    string ret = ""; 
    string line; 
    ifstream ifs(filename); 
    if (ifs.is_open()) { 
     while (getline(ifs, line)){ 
      ret += line + '\n'; 
     } 
    } else { 
     std::cout << "failed to open file: " << filename << std::endl; 
    } 

    return ret.c_str(); 
} 

は私のメインです:

#include <iostream> 
#include "FileOps.h" 

void test_func2(const char* test) { 
    std::cout << strlen(test) << std::endl; 
    std::cout << test << std::endl; 
} 

void test_func1(const char* test) { 
    test_func2(test); 
} 

int main(int argc, char** argv) 
{ 
    test_func1(read_file_contents("test.txt")); 
    return 0; 
} 

ことができる人この現象を説明する?ありがとう!

答えて

3

これは未定義の動作です。

return ret.c_str(); 

オブジェクトretは、ローカル関数スコープを有しています。この関数は、この関数が復帰したときにこのオブジェクトが破壊され、その内部メモリがすべて解放されます。

c_str()メソッドは、オブジェクトが破棄された後も有効ではなくなったポインタを返します。この関数が返るとすぐにc_str()ポインタは無効になります。

c_str()によって返されるポインタは、std::stringオブジェクトが変更されるか、または破棄されるまで有効です。

+0

ありがとうございます!これは私の問題を解決しました。私のC + +はobvioulsy rustyです – sc2bigjoe

関連する問題