c++程序在删除字符数组时退出

C++ program Exits when deletes an char array

本文关键字:数组 退出 字符 删除 程序 c++      更新时间:2023-10-16

在删除数组元素时出现问题。您可以在下面看到我的一些代码。

在第二次for循环运行delete[] payload[x].data后,程序退出。

    struct s_payload{
        u_char data[300];
    }
    .
    .
    u_char sample[300] ="Lorem ipsum dolor sit amet, eu mea laudem impetus.";
    int _bufferSizeConnection = 1000;
    int testCounter = 0;
    s_payload* activeBuffer = new s_payload[_bufferSizeConnection];
    for (;;) {
        for (long int counter = 0; counter < _bufferSizeConnection; counter++) {        
            memcpy(activeBuffer[counter].data, sample, 299);
        }
        //_buffersConnection is std::queue
        _buffersConnection.push(activeBuffer);
         testCounter += 1;
        if (testCounter == 15) {
            LOG_INFO(">testcounter %d", testCounter);
            break;
        }            
        activeBuffer = new s_payload[_bufferSizeConnection];                       
    }        
    for (int i = 0; i < 15; i++) {
        //taking one of the activeBuffer from _buffersConnection
        s_payload* payload = _buffersConnection.wait_and_pop();         
        for (int x = 0; x < _bufferSizeConnection; x++) {
            u_char* current= payload[x].data;
            delete[] payload[x].data;   //Exit at the second running of this line;
        }
        delete[] payload;
    }

这段代码有什么问题?

你已经说了activeBuffer = new s_payload[...],所以你可以合法地说delete[] activeBuffer。然而,在activeBuffer的每个s_payload元素中,data是一个数组,而不是指针。因此,您不需要delete payload[x].data —当你使用delete payload[x]delete[] payload时,data也会消失。

然而,我建议你重新思考你的方法,而不是试图修补你已有的东西。你正在推送和弹出固定大小的缓冲区数组—这真的有必要吗?您是否可以只push和pop std::string s或std::vector<unsigned char> s,而不必担心内存管理?例如,std::vector可以保存任意数量的数据。

让库做尽可能多的工作,这样你就不必这样做了!