我有一个 libev 写回调函数,它检查要发送到客户端的待处理数据。待处理的数据缓冲区看起来像
struct PendingData{
unsigned short data_size;
char data[4096];
};
typedef std::list<PendingData*> PendingBuf;
class Client{
private:
int sock;
PendingBuf data_list;
public:
ev::io cl_io;
void write_cb(ev::io &watcher, int events);
};
并且回调函数通过以下方式检查容器中是否有任何数据:
void Client::write_cb(ev::io &watcher, int events){
PendingData* pd = NULL;
int ires = 0;
if(!data_list.empty()){
pd = data_list.front();
ires = send(sock, pd->data, pd->data_size, 0);
if(ires == pd->data_size){
delete pd;
data_list.pop_front();
return;
}
// .... additional checking here
}
}
程序因分段错误而崩溃
if(!data_list.empty())
有时在
pd = data_list.front();
在第二种情况下,empty() 返回 false,但调试器显示,该列表没有数据成员
它在单独的线程中运行(缓冲区是从同一个线程读取和写入的)我还尝试将其移动到主线程而不启动任何其他线程,但效果相同。
操作系统是 Ubuntu 12.04,编译器是 g++ 4.6 我在我的项目中也启用了 c++0x