Буфер отладочного утверждения сбой! = Nullptr - PullRequest
0 голосов
/ 03 ноября 2019

Вот мой код:

    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() запускает утверждение отладки.

Сообщение об ошибке:

Выражение: buffer! = Nullptr

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Непонятно, что такое 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() может дать неверный результат. См этот вопрос .

0 голосов
/ 03 ноября 2019

Попробуйте вызвать ifile.clear (), прежде чем искать начало внутри блока try:

try {// call clear ifile.clear ();// Получить двоичный файл и зашифровать с помощью XOR ifile.seekg (0, ios :: beg);беззнаковый символ temp = 0;while (ifile) {

...