如何对OVERLAPPED结构执行memset操作将hEvent设为nullptr
问题解答
1. 能否使用memset实现hEvent置为nullptr?
可以,该操作在Windows平台下完全安全:
- OVERLAPPED结构体的
hEvent成员类型为HANDLE,属于指针类型,Windows平台上空指针的二进制表示就是全0字节,使用memset将整块内存按字节清零后,hEvent自然会被设置为nullptr。 - 注意该操作会同时将OVERLAPPED的其余所有成员(Internal、InternalHigh、Offset、OffsetHigh)也清零,这恰好符合绝大多数重叠IO场景下对OVERLAPPED结构体的初始化要求。
2. 比for循环更优的实现方案
方案一:使用memset(兼容所有C++版本)
直接对数组整块内存清零,效率远高于手写逐元素for循环,标准库的memset实现会针对不同CPU架构做指令级优化:
OVERLAPPED* oarray = new OVERLAPPED[100]; memset(oarray, 0, sizeof(OVERLAPPED) * 100);
方案二:C++11及以上版本值初始化(代码更简洁)
在new数组时添加空括号触发值初始化,编译器会自动完成所有元素的零初始化,无需额外调用函数:
// 末尾的*()*会触发数组元素的零初始化,所有成员默认置0 OVERLAPPED* oarray = new OVERLAPPED[100]();
特殊场景说明
如果你只需要将hEvent设为nullptr,且需要保留OVERLAPPED其余成员的原有值,那没有比for循环更合适的方案,只能逐元素赋值:
for (int i = 0; i < 100; ++i) { oarray[i].hEvent = nullptr; }
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

