我有以下代码:
void SendRequest(HINTERNET connection, LPCWSTR method, LPCWSTR referer,LPCWSTR path,WINHTTP_STATUS_CALLBACK whCallback){
HINTERNET request;
request=WinHttpOpenRequest( connection, 0,path,0,referer,WINHTTP_DEFAULT_ACCEPT_TYPES,0);
WinHttpSetStatusCallback(request, (WINHTTP_STATUS_CALLBACK)whCallback,WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,0);
REQUEST_CONTEXT cpContext;
WinHttpSendRequest(request,WINHTTP_NO_ADDITIONAL_HEADERS,0,NULL,NULL,NULL,(DWORD_PTR)&cpContext);
};
WinHttpSendRequest不会阻塞,因此一旦执行,函数便会结束。但是,WinHttpSendRequest以cpContext作为参数回调到另一个函数。所以我的问题是,函数结束后cpContext是否会被破坏?因为无法在函数外部访问cpContext,这是否会导致内存泄漏?如何以最佳C ++做法做到这一点?
最佳答案
cpContext
在函数末尾被销毁。这导致未定义的行为,因为cpContext
可能在调用回调之前被破坏。如果从回调中取消引用指向它的指针,则这是未定义的行为。解决此问题的一种方法是避免使用局部作用域变量:
REQUEST_CONTEXT* cpContext = new REQUEST_CONTEXT();
WinHttpSendRequest(request,WINHTTP_NO_ADDITIONAL_HEADERS,0,NULL,NULL,NULL,(DWORD_PTR)cpContext);
不要忘记在回调函数中使用
delete
。泄漏将是
HINTERNET
句柄,除非您在回调中将其关闭。该句柄需要使用WinHttpCloseHandle
关闭,但是在异步请求处于活动状态时,您无法将其关闭。