C ++字符数组分配错误

时间:2010-12-04 08:29:19

标签: c++ string c-strings

我有一个旨在获取文件内容的函数:

bool getFileContents(std::string loc, std::string &code) {
    std::ifstream file(loc.c_str());

    if(!file.is_open())
        return err("Source file could not be read");

    int length;
    file.seekg(0, std::ios::end);
    length = file.tellg();
    file.seekg(0, std::ios::beg);

    char *buffer = new char[length];
    file.read(buffer, length);
    code = buffer;
    delete[] buffer;

    file.close();

    return true;
}

当我运行此功能时,始终准确检索文件的长度。但是,如果我用一个文件调用该函数一次,用一个不存在的文件再次调用它,然后用原始文件再次调用它,字符串'buffer'大于int'length'。

嗯,这可能不准确,而是 - 当字符串'buffer'被复制到字符串'code'时,'code'比'length'长。在每个实例中,'code'在调用'getFileContents'之前立即实例化,因此它不是先前值的问题。

如果我检索文件的内容,随后在文件中添加或删除某些文本,并再次检索相同文件的内容,似乎也会出现这种情况。

我对字符串没什么经验,并且认为我没有正确使用它们,但是我使用的代码来自一个例子,我不能为我的生活找到任何错误。

感谢您的帮助, 悦

2 个答案:

答案 0 :(得分:3)

嗯,问题是code = buffer依赖于NUL(\ 0)字符来知道缓冲区的结束位置。有时您可能偶然得到NUL角色(特别是当程序刚刚开始时),但并非总是如此。因此间歇性的行为。

尝试将code = buffer替换为code = std::string(buffer, length)

答案 1 :(得分:0)

除了 aix 描述的\ 0问题之外,你做了双重分配,这里不需要和不安全(在delete之前可能是一个例外)你会有内存泄漏)。相反,您可以在字符串中分配缓冲区,如下所示:

code.resize(length);
file.read(&code[0], length);

不要忘记检查read的返回值。无法保证在一个步骤中读取所有length个字节。