Исключение времени выполнения std::bad_alloc

Я получаю исключение std::bad_aloc на стороне сервера, когда цикл for достигает второго раунда. Вот код:

void UDP_ProcessClient (int socketFileDescriptor, void *transmitBuffer, void *receiveBuffer, size_t transmitBufferSize, struct sockaddr *clientAddress, socklen_t clientAddressLength, char *workDir, size_t fileNumber)
{
    size_t i;
    size_t bufferSize = 0;
    string resultName, imageName;

    for (i = 0; i < 6; i++)
    {
        /// Start communicating (read/write)
        /// Prepare buffers for communication
        cout << "[Server]: Receiving data from client..." << endl;
        UDP_ReceiveData(socketFileDescriptor, (uint32_t *) &bufferSize, sizeof(bufferSize), MSG_WAITALL, clientAddress, &clientAddressLength);      /// Get required data buffer size
        //cout << "[Server]: PHPDHPHPHFPSADHFI" << endl;
        receiveBuffer = new uint8_t[bufferSize];                                                                                                    /// Allocate memory
        clog << "Receiving file of size " << bufferSize << endl;
        UDP_ReceiveData(socketFileDescriptor, (int8_t *) receiveBuffer, bufferSize, MSG_WAITALL, clientAddress, &clientAddressLength);              /// Read data
        //cout << "SDFDSFDSFFADSFASDFSDVLALALL " << bufferSize << endl;

        cout << '\a';
        cout << "[Server]: Data received successful" << endl;

        /// Save image.bmp file
        resultName = workDir;
        imageName = "image_" + to_string(fileNumber) + ".jai";
        resultName += imageName;
        createImageFromBuffer((uint8_t *) receiveBuffer, bufferSize, resultName);

        /// Clear memory
        bufferSize = 0;
        delete[] (uint8_t *) receiveBuffer;
    }
}

После каждого выделения памяти new [] в начале раунда не забываю освобождать ее delete [] в конце конца каждого раунда. Все полученные файлы имеют одинаковый размер. Я могу показать код клиента, но я думаю, что он работает правильно.

Код на стороне клиента:

    for (i = 0; i < 6; i++)
    {
        /// Do useful work (payload)
        /// Prepare files
        imageFileFullName = pathToImageFiles + imageFileName + std::to_string(i) + imageFileFormat;
        std::clog << "Opening file..." << std::endl;
        imageFile = new std::fstream;
        imageFile->open(imageFileFullName, std::ios::in | std::ios::binary | std::ios::ate);
        //checkFileOpened(imageFile);
        if (!(imageFile->is_open()))
        {
            std::cerr << "Can't open file " << imageFileFullName << ": ";
            perror("");
            exit(EXIT_FAILURE);
        }
        imageFileSize = imageFile->tellg();
        imageFile->seekg(0, std::ios::beg);
        /// Prepare transmit buffer
        transmitBuffer = new uint8_t[imageFileSize];
        std::cout << "Reading file..." << std::endl;
        imageFile->read((char *) transmitBuffer, imageFileSize);
        imageFile->close();

        delete imageFile;                                           /// Delete used file

        /// Send/Receive Data to/from Server
        std::cout << "Sending file..." << std::endl;
        UDP_SendData(socketFileDescriptor, &imageFileSize, sizeof(imageFileSize), MSG_CONFIRM, (struct sockaddr *) addressIterator_Pointer->ai_addr, addressIterator_Pointer->ai_addrlen);
        UDP_SendBigPacket(socketFileDescriptor, (uint8_t *) transmitBuffer, imageFileSize, MSG_CONFIRM, (struct sockaddr *) addressIterator_Pointer->ai_addr, addressIterator_Pointer->ai_addrlen);

        delete[] transmitBuffer;                                    /// Free memory
    }
...

Исключение времени выполнения на стороне сервера:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

person Ruslan    schedule 17.12.2019    source источник
comment
std::bad_alloc происходит, если запрошенный объем памяти не может быть выделен. Каково значение bufferSize?   -  person nromashchenko    schedule 17.12.2019
comment
Похоже, пришло время узнать, как использовать отладчик   -  person churill    schedule 17.12.2019


Ответы (1)


Одним из возможных объяснений может быть то, что bufferSize неоправданно велик. Попробуйте отладить код, если это возможно, или распечатайте bufferSize, чтобы увидеть его.

person Jakub Novák    schedule 17.12.2019
comment
Это должен быть комментарий, а не ответ. - person Kiril1512; 17.12.2019
comment
благодаря политикам stackoverflow я пока не могу комментировать, так как для этого требуется 50 повторений - person Jakub Novák; 18.12.2019