我有以下代码:

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关闭,但是在异步请求处于活动状态时,您无法将其关闭。

09-06 21:49