你不需要泄漏任何东西。只需使用结构体的userData
字段ENetPacket
来存储要删除的std::vector
,然后在回调中删除即可:
void myCallback(ENetPacket *pkt) {
std::vector<uint8_t> *data=(std::vector<uint8_t> *)pkt->userData;
delete data;
}
void sendData() {
//Create the vector in heap, so it is not destroyed after returning from this function, effectively extending its life until the callback is called.
std::vector<uint8_t> *data=new std::vector<uint8_t>;
//Fill data here
ENetPacket *pkt=enet_packet_create(data.data(), data.size(), ENET_PACKET_FLAG_NO_ALLOCATE);
pkt->userData=(void*)data;
pkt->freeCallback=myCallback;
}
userData
void 指针是保存不透明用户数据并在回调中使用它的常用策略,因此库的用户可以检索调用回调的上下文。
它可以是任何东西(void*
),来自状态持有者结构以便在回调之后执行复杂的逻辑,或者只是需要像您的情况一样释放的数据指针。
从您的评论中,您说您不想动态分配vector
.
请记住,向量内的任何数据都已被动态分配(除非使用了自定义分配器)并且ENetPacket
结构也已被动态分配(传递的标志只是表示不分配data
,而不是结构)
最后,如果您知道(或可以预先计算)数据的大小,另一种方法是创建传递 NULL 数据指针的数据包。
该函数enet_packet_create
将创建数据缓冲区,您可以直接将数据填充到数据包缓冲区中,而不需要不同的缓冲区然后将其复制到数据包中。