簡體   English   中英

std::bad_alloc 運行時異常

[英]std::bad_alloc runtime exception

for循環到達第二輪時,我在服務器端收到 std::bad_aloc 異常。 這是代碼:

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

一種可能的解釋可能是 bufferSize 過大。 如果可能,嘗試調試代碼,或打印出 bufferSize 以查看它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM