C ++程序删除char数组时退出

时间:2016-10-20 17:21:47

标签: c++ memory-management dynamic-allocation

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

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

    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;
    }

这段代码有什么问题? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

你说activeBuffer = new s_payload[...],所以你可以合理地说delete[] activeBuffer。但是,datas_payload的每个activeBuffer元素中的数组,而不是指针。因此,您无需delete payload[x].data - 只要delete payload[x]delete[] payloaddata也将消失。

但是,我建议您重新考虑您的方法,而不是尝试修补您的方法。你正在推动并弹出固定大小的缓冲区数组 - 这真的有必要吗?你可以推送std::stringstd::vector<unsigned char>,而不必担心你的记忆管理吗?例如,std::vector可以保存任意数量的数据。

让图书馆尽可能多地完成工作,这样你就不用了!