我需要创建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
调用是否正在搞乱指针地址?似乎不太可能。