【问题标题】:Debug Assertion Failed buffer != nullptr调试断言失败缓冲区!= nullptr
【发布时间】:2020-02-29 02:21:13
【问题描述】:

这是我的代码:

    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

【问题讨论】:

  • 我在这段代码中既没有看到调试断言,也没有看到变量buffer
  • 请提供完整的错误信息。在您包含在问题中的那一行之前或之后会有更多的行。此处还需要minimal reproducible example 以获取调试帮助。
  • 链接图像给出 404,您应该将错误消息作为纯文本编辑到问题中。见How to Ask
  • @64BitO2 任何相关代码(和错误消息)都应在问题中,如文本。不在外部链接后面。
  • (char*)temp 应该是&amp;temp

标签: c++ ifstream assertion


【解决方案1】:

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

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

这里先用零初始化temp,然后转换成指针,其实就是一个空指针。使用空指针调用 .read() 是 UB - 在位置 (char*)temp (= nullptr) 处没有有效的内存缓冲区。

你想要的,大概是这样的:

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

在这里,您将temp 的有效地址传递给.read()

另请注意,从tellg() 获取文件大小可能会产生不正确的结果。见this question

【讨论】:

    【解决方案2】:

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

    试试 { // 调用清除 ifile.clear(); //获取二进制并用XOR加密 ifile.seekg(0, ios::beg); 无符号字符温度 = 0; 同时(ifile) {

    【讨论】:

    • 这根本不是问题。
    • 请不要在发布答案时只猜测。
    猜你喜欢
    • 2014-10-07
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多