我正在使用 epoll 进行网络编程,我有这段代码。
int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);
printf("read %d \n", str_len);
if(str_len == 0){
if(!removeClient(m_events[i].data.fd))
break;
close(m_events[i].data.fd);
}
else {
printf("ServerManager::eventAcceptLoop, A message has been received \n");
pushWork(buf);
}
buf 是这样声明的
buf[BUF_SIZE];
我想将 buf 中的数据传递给函数“pushWork”
pushWork(char * pdata){
hand this pdata to the thread pool to parse and handle it
}
我认为我需要复制 buf 中的数据而不是指向 buf,因为每当有新数据进入时它都会被覆盖。现在我做类似的事情
char *pdata = buf;
pushWork(pdata)
我应该做 memcopy 还是其他?并刷新 buf? 请让我知道我该如何处理。提前致谢...
最佳答案
是的,你可以复制数据:
char* pdata = new char[str_len];
memcpy(pdata, buf, str_len);
pushWork(pdata);
在 pushWork
端,它必须负责在完成后释放数据:
delete[] pdata;
您还需要考虑将这些全部封装到一个 std::vector
中,这样您就不必担心异常安全:
std::vector<char> data(buf, buf + str_len);
pushWork(data);
在这种情况下,需要修改 pushWork 以获取 std::vector
按值,但好处是它不必担心删除数据完成后,将是完全异常安全的。
关于c++ - 如何复制缓冲区中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380274/