从函数 C++ 返回后,字符串似乎未分配

问题描述 投票:0回答:1

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

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

入口.cpp

#include <string>
#include <fstream>
#include <iostream>

const char* ReadFile(const std::string& path) {

    std::ifstream file;

    try {
        file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
        file.open(path);

        if (!file.is_open()) {
            throw;
        }
    }
    catch (std::exception e) { //file does not exist
        std::string errmsg = "Unable to open file at path: " + path;

        std::cout << errmsg << std::endl;

        throw new std::exception(errmsg.c_str());
    }


    std::string contents;
    try {
        contents = std::string{ std::istreambuf_iterator<char>{file}, {} };
    }
    catch (const std::ifstream::failure& e) {

        std::cout << path << std::endl;
        std::cout << e.what() << std::endl;

        throw e;
    }

    std::cout << "----------------" << std::endl;
    std::cout << "in the function:" << std::endl;
    std::cout << contents.c_str() << std::endl;

    return contents.c_str();
}

int main() {
    const char* a = ReadFile("test.txt");

    std::cout << "----------------" << std::endl;
    std::cout << "in main" << std::endl;
    std::cout << a << std::endl;

    return 0;
}

测试.txt

example content

dfhfrdhdf
h

srjed
jt
tejk
e
tktre
krtk

控制台日志

----------------
in the function:
example content

dfhfrdhdf
h

srjed
jt
tejk
e
tktre
krtk
----------------
in main
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌

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

c++ garbage-collection fstream ifstream
1个回答
0
投票

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

但是答案很简单,只需将函数更改为返回一个

std::string
即可。

std::string ReadFile(const std::string& path) {
    ...
    return contents;
}
© www.soinside.com 2019 - 2024. All rights reserved.