2016-04-22 89 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++顯得生鏽 – sc2bigjoe