本人写了个递归函数
假如使用 *pSendF = [&pSendF] 那么程序崩溃。
假如使用 *pSendF = [pSendF] 那么内存泄漏。
求高手支招怎么样选择,代码如下。
假如使用 *pSendF = [&pSendF] 那么程序崩溃。
假如使用 *pSendF = [pSendF] 那么内存泄漏。
求高手支招怎么样选择,代码如下。
#include <stdio.h> #include <tchar.h> #include <memory> #include <functional> #include <thread> #include <mutex> #include <stdlib.h> #include <crtdbg.h> std::mutex g_pCallFunMu; std::function<void()> g_pCallFun; int g_nTestNum = 2; int main() { auto pTh = std::make_shared<std::thread>([] { while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(300)); std::function<void()> pFun; { std::lock_guard<std::mutex> lc(g_pCallFunMu); if (nullptr != g_pCallFun) { pFun = g_pCallFun; } } if (pFun) { pFun(); } if (g_nTestNum < 0) { g_pCallFun = nullptr; break; } } }); { auto pSendF = std::make_shared<std::function<void()>>(); *pSendF = [&pSendF]()->void //递归函数 { --g_nTestNum; if (g_nTestNum >= 0) { std::lock_guard<std::mutex> lc(g_pCallFunMu); g_pCallFun = [pSendF] //另一个线程调用 { (*pSendF)(); }; } }; (*pSendF)(); pSendF = nullptr; } pTh->join(); pTh = nullptr; _CrtDumpMemoryLeaks(); //内存泄漏检测 return 0; }
假设通过网络发送文件,文件很大,需要分多次发送。发送完成一部分后,需要等待对方应答。收到对方应答后继续发送下一部分。
pSendF 相似于发送文件的函数。g_pCallFun表示其它线程收到对方应答,然后继续调用发送函数。
.
解决方案
20
怎么样将简单问题复杂化…..本人引用本人当然引用计数没法减少了、
….直接裸指针, 确定不再使用再统一释放, 嫌弃裸指针就用弱指针咯
….直接裸指针, 确定不再使用再统一释放, 嫌弃裸指针就用弱指针咯
20
循环引用一端使用弱指针