程序崩溃和内存泄漏2选1

C++语言 码拜 6年前 (2016-06-09) 402次浏览
本人写了个递归函数
假如使用 *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

循环引用一端使用弱指针

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明程序崩溃和内存泄漏2选1
喜欢 (0)
[1034331897@qq.com]
分享 (0)