从函数返回后字符串似乎被释放

Hen*_*yer 3 c++ fstream lifetime ifstream

我目前正在尝试创建一个简单的函数来读取文件的内容并将其存储到 astd::stringchar数组中。我遇到了这样的问题:数据在函数内完全读取,但在调用函数时似乎被删除/释放。

\n

我已将这个问题隔离到一个小程序中:

\n

入口.cpp

\n
#include <string>\n#include <fstream>\n#include <iostream>\n\nconst char* ReadFile(const std::string& path) {\n\n    std::ifstream file;\n\n    try {\n        file.exceptions(std::ifstream::failbit | std::ifstream::badbit);\n        file.open(path);\n\n        if (!file.is_open()) {\n            throw;\n        }\n    }\n    catch (std::exception e) { //file does not exist\n        std::string errmsg = "Unable to open file at path: " + path;\n\n        std::cout << errmsg << std::endl;\n\n        throw new std::exception(errmsg.c_str());\n    }\n\n\n    std::string contents;\n    try {\n        contents = std::string{ std::istreambuf_iterator<char>{file}, {} };\n    }\n    catch (const std::ifstream::failure& e) {\n\n        std::cout << path << std::endl;\n        std::cout << e.what() << std::endl;\n\n        throw e;\n    }\n\n    std::cout << "----------------" << std::endl;\n    std::cout << "in the function:" << std::endl;\n    std::cout << contents.c_str() << std::endl;\n\n    return contents.c_str();\n}\n\nint main() {\n    const char* a = ReadFile("test.txt");\n\n    std::cout << "----------------" << std::endl;\n    std::cout << "in main" << std::endl;\n    std::cout << a << std::endl;\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

测试.txt

\n
example content\n\ndfhfrdhdf\nh\n\nsrjed\njt\ntejk\ne\ntktre\nkrtk\n
Run Code Online (Sandbox Code Playgroud)\n

控制台日志

\n
----------------\nin the function:\nexample content\n\ndfhfrdhdf\nh\n\nsrjed\njt\ntejk\ne\ntktre\nkrtk\n----------------\nin main\n\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\xe2\x96\x8c\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过使用strcpy复制函数内部的数据,这给了我各种内存错误(尽管我可能使用错误)。

\n

joh*_*ohn 5

您正在返回一个指向字符串内容的指针,但不幸的是,当您退出该函数时,该字符串被破坏,因此您的指针指向垃圾。

但答案很简单,只需将函数更改为返回一个std::string.

std::string ReadFile(const std::string& path) {
    ...
    return contents;
}

int main() {
    std::string a = ReadFile("test.txt");
    ...
    std::cout << a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果char*出于某种原因您确实需要一个指向字符串的指针,请.c_str()在您真正需要它的时候调用,而不是之前。