来自std :: queue元素删除的分段错误

时间:2014-06-13 04:37:39

标签: c++ sockets memory

我需要创建UDP缓冲区,我选择了std::deque来推送和弹出udp数据包,以便存储它们。 deque采用以下形式:

std::deque<unsigned char *> packetStack;

现在每次调用udp数据包时,我都会执行以下操作:

packetStack.push_back(new unsigned char[buffersize])
(nbytes = recvfrom(fdUdp, (void*)packetStack.back(), buffersize, 0, (struct sockaddr *) &addr, &addrlen)) < 0)
if (nbytes <= 0)
{
     delete[] packetStack.back(); // Not sure if this one actually gets c
                                   // called but I dont think so. I assume 
                                   // it would fail in the same way as the one
                                   // below that i am about to explain.
     packetStack.pop_back();
}

我非常确定应该有效。我提供了buffersize保留的缓冲区的内存地址。

当我使用这些数据包时,我会执行以下操作:

if (packetStack.empty() == false)
{
    function(packetStack.front());
    delete[] packetStack.front(); //segfaults here
    packetStack.pop_front();
}

所以我得到了一个段错误。我不喜欢用c ++进行内存管理,所以在这一点上我想问使用套接字调用比使用unsigned char *更好吗?

但我不确定为什么这不起作用?我想也许是暂时将内存分配到范围之外但我尝试了这个简单的例子:

#include <iostream>
#include <deque>


std::deque<unsigned char *> get(void)
{
    std::deque<unsigned char *> stuff;
    stuff.push_back(new unsigned char[20]);
    stuff.push_back(new unsigned char[20]);
    stuff.push_back(new unsigned char[20]);
    stuff.push_back(new unsigned char[20]);
    return stuff;
}

int main()
{
    std::deque<unsigned char *> stuff = get();
    delete[] stuff.back();
    stuff.pop_back();
    delete[] stuff.back();
    delete[] stuff.front();
}

这一切都很好。 除非我遗漏了会导致UB的事情?

我能想到的唯一其他事情是recvfrom调用是否正在搞乱指针地址?似乎不太可能。

0 个答案:

没有答案