调试断言失败缓冲区!= nullptr

时间:2019-11-03 16:12:10

标签: c++ ifstream assertion

这是我的代码:

    ifstream ifile;
    list<unsigned char> fbinary;

    ifile.open(filename, ios::binary);
    if (ifile.fail() || !ifile.is_open())
        return false;

    ifile.seekg(0, ios::end);
    int sz = ifile.tellg();
    if (sz <= 0)
        return false;

    try
    {
        //Get Binary And Encrypt with XOR
        ifile.seekg(0, ios::beg);
        unsigned char temp = 0;
        while (ifile)
        {
            ifile.read((char*)temp, sizeof(unsigned char));
            temp ^= Encrypt_Key;
            fbinary.push_back(temp);
        }

        ifile.close();
    }
    ...

file.open并获取文件大小不会失败。我不知道为什么ifile.read()会触发调试断言。

错误消息:

  

表达式:缓冲区!= nullptr

2 个答案:

答案 0 :(得分:1)

目前尚不清楚buffer是什么(它可能是标准库实现中的变量),但是问题中的代码至少存在一个明显的错误:

unsigned char temp = 0;
... 
ifile.read((char*)temp, sizeof(unsigned char));

在这里,您首先用0初始化temp,然后将其转换为指针,该指针实际上是一个空指针。用空指针调用.read()是UB-在位置(char*)temp (= nullptr)上没有有效的内存缓冲区。

您想要的可能是这样:

char temp;
... 
ifile.read(&temp, sizeof(char));

您将temp的有效地址传递到.read()中。

还要注意,从tellg()获取文件大小可能会导致错误的结果。参见this question

答案 1 :(得分:-4)

在尝试开始之前,在try块内尝试调用ifile.clear():

尝试     {        //呼叫清除         ifile.clear();         //使用XOR获取二进制文件并加密         ifile.seekg(0,ios :: beg);         无符号字符温度= 0;         而(ifile)         {