实现包含windows HANDLE对象的复制构造函数
Implementing copy constructor involving windows HANDLE objects
我是win32 API的新手,所以请原谅我。
我目前正在做一个涉及Winsock的c++项目,但是我对如何正确使用事件对象HANDLE类型的复制构造函数感到困惑。
概述(代码如下):在尝试使用IOCP和保持一切可扩展,我有一个线程,检查多个接受事件。每个ServerConnection对象都拥有自己的接受事件对象,该对象由WSACreateEvent()、其关联的低级套接字和相关的状态/变量创建。
我的问题是,我试图实现"三大",我不太确定我应该如何"复制"句柄。
DuplicateHandle()似乎创建了一个新的句柄,但它指向同一个对象,但就ServerConnection"副本"而言,这没有意义(我们想要一个具有相同状态的新对象,对吗?)。
至于使用复制赋值操作符,我不确定它会对事件对象句柄做什么。
ServerConnection.h
class ServerConnection
{
public:
//...constructors, destructors, etc...
virtual HANDLE getAcceptEvent();
virtual void setAcceptEvent(HANDLE eventObj);
protected:
private:
HANDLE assocAcceptEvent;
//..other variables...
};
ServerConnection.cpp
ServerConnection::ServerConnection(ServerConnection &that)
{
//blah blah...other vars
//? This does not seem right as the HANDLE is logically a pointer;
//Assigning like this just points another handle to the same event obj
//If the other ServerConnection object closes the handle...not good.
this.assocAcceptEvent = that.assocAcceptEvent;
//The only thing that make slightly more sense, is just to create a whole new one
//if I answered my own question, then great...but I wanted to make sure
this.assocAcceptEvent = WSACreateEvent();
//assume check for WSACreateEvent failing with WSAGetLastError() and
//handle appropriately
}
事实上,你不能以一种明智的方式复制句柄(也就是说,DuplicateHandle
不做你想做的)让我认为这个对象不应该是可复制的…
你要问自己的问题是:服务器连接的副本实际上意味着什么?你会在哪里/如何使用它?
我不知道答案,因为我不知道你的整体设计是什么意思是做一个ServerConnection -但事实上,它说ServerConnection让我认为它是"连接"到一些东西,因此不能轻易复制。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用