GetAcceptExSockaddrs 填充的指针的生命周期
Lifetime of pointers filled in by GetAcceptExSockaddrs
GetAcceptExSockaddrs 上的 MSDN 页面没有指定任何有关释放返回的地址指针 LocalSockaddr
和 RemoteSockaddr
的内容。尝试释放它们会导致调试堆报告错误。所以我假设这些是一些静态指针。但在那种情况下,有更多知识的人可以提供一些关于他们一生的信息吗?这是通常的有效期至下次调用吗?
更准确地说-函数填充指向指针的指针,这就是为什么这不是简单地将指针传递给堆栈变量的原因。考虑这个片段:
INT LocalAddressLength = 0, RemoteAddressLength = 0;
LPSOCKADDR LocalAddress = nullptr, RemoteAddress = nullptr;
m_pGetAcceptExSockaddrs(buf, m_nReceiveBufferSize, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, &LocalAddress, &LocalAddressLength, &RemoteAddress, &RemoteAddressLength);
函数本身设置指针而不是仅仅填充它们的内容。
文档没有告诉你如何释放内存,因为你不需要释放内存。文档说:
The GetAcceptExSockaddrs function parses the data obtained from a call to the AcceptEx function and passes the local and remote addresses to a sockaddr structure.
在我看来,这句话的措辞很糟糕,但我希望这意味着返回的地址指向所提供缓冲区内的某处。换句话说,没有分配新内存,只要提供的缓冲区有效,GetAcceptExSockaddrs
返回的地址就有效。
GetAcceptExSockaddrs 上的 MSDN 页面没有指定任何有关释放返回的地址指针 LocalSockaddr
和 RemoteSockaddr
的内容。尝试释放它们会导致调试堆报告错误。所以我假设这些是一些静态指针。但在那种情况下,有更多知识的人可以提供一些关于他们一生的信息吗?这是通常的有效期至下次调用吗?
更准确地说-函数填充指向指针的指针,这就是为什么这不是简单地将指针传递给堆栈变量的原因。考虑这个片段:
INT LocalAddressLength = 0, RemoteAddressLength = 0;
LPSOCKADDR LocalAddress = nullptr, RemoteAddress = nullptr;
m_pGetAcceptExSockaddrs(buf, m_nReceiveBufferSize, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, &LocalAddress, &LocalAddressLength, &RemoteAddress, &RemoteAddressLength);
函数本身设置指针而不是仅仅填充它们的内容。
文档没有告诉你如何释放内存,因为你不需要释放内存。文档说:
The GetAcceptExSockaddrs function parses the data obtained from a call to the AcceptEx function and passes the local and remote addresses to a sockaddr structure.
在我看来,这句话的措辞很糟糕,但我希望这意味着返回的地址指向所提供缓冲区内的某处。换句话说,没有分配新内存,只要提供的缓冲区有效,GetAcceptExSockaddrs
返回的地址就有效。