- 我有一个 MainProgram.exe 调用 MyDll.dll 并使用 curl 在回调函数中接收数据。
- 我将 curl 包装在一个名为 CurlGetData 的函数中,该函数创建一个 curl 实例并执行 curl_easy_perform。
这是我的代码:
//Interface class to derive from
class ICurlCallbackHandler
{
public:
virtual size_t CurlDataCallback( void* pData, size_t tSize ) = 0;
};
//Class that implements interface
class CurlCallbackHandler : public ICurlCallbackHandler
{
public:
bool m_exit = false;
virtual size_t CurlDataCallback( void* pData, size_t tSize ) override
{
if(m_exit)
return CURL_READFUNC_ABORT;
// do stuff with the curl data
return tSize;
}
}
CurlCallbackHandler *m_curlHandler;
//Create an instance of above class in my dll constructor
MyDll:MyDll()
{
m_curlHandler = new CurlCallbackHandler();
}
//Cleanup above class in my dll destructor
MyDll:~MyDll()
{
delete m_curlHandler;
m_curlHandler = nullptr;
}
//Function to start receiving data asynchronously
void MyDll::GetDataAsync()
{
std::async([=]
{
//This will receive data in a new thread and call CurlDataCallback above
//This basically calls easy_perform
CurlGetData(m_curlHandler);
}
}
//Will cause the curl callback to return CURL_READFUNC_ABORT
void MyDll::StopDataAsync()
{
m_curlHandler->m_exit = true;
}
GetDataAsync 函数是从我的主程序调用的,它基本上调用 curl_easy_perform 并使用 m_curlHandler 作为其回调函数,该回调函数回调到 CurlDataCallback。
这一切都很好,但是每当我的主程序退出时,它都会调用 MyDll::StopDataAsync 来停止 curl 数据回调,然后调用 MyDll 的析构函数来清理 m_curlHandler。
但我发现此时 curl 尚未完成此回调,并且程序崩溃,因为 m_curlHandler 已被删除,但新异步线程中的 curl 回调仍在使用它。
有时它可以正常关闭,但有时由于 curlcallback 试图访问已被析构函数删除的指针而崩溃。
我怎样才能最好地清理 m_curlHandler?我想避免等待超时,因为这会影响我的主程序的性能。