本人写了个递归函数
假如使用 *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
循环引用一端使用弱指针