带有线程的 MFC 应用程序中的内存泄漏
Posted
技术标签:
【中文标题】带有线程的 MFC 应用程序中的内存泄漏【英文标题】:Memory leaks in MFC application with threads 【发布时间】:2012-05-07 14:44:30 【问题描述】:任何人都可以帮助解决 MFC 应用程序中的内存泄漏问题吗?如果没有以下代码块,该程序似乎可以正常工作。该块包括几个任务的条件执行和将数据传递给 MFC 对话框数据成员,然后更新 MFC 对话框上的指示器。其他测试显示一切正常,除了调试窗口中有内存泄漏消息。平台:WIN 7 64bit,MSVC 2011。谢谢!
#include <vector>
#include <thread>
//Implementation parallel tasking
void CMASTERDlg::OnCompositeParalleltasking()
const int totTsk=8;
BOOL select[totTsk]=
m_Parallel_Audio,
m_Parallel_DDS,
m_Parallel_HV,
m_Parallel_Monitor,
m_Parallel_PDA,
m_Parallel_Pulnix,
m_Parallel_Supertime,
m_Parallel_Temp;
//Put all selected tasks in a thread vector
std::vector<std::thread> threads;
auto pvThread = threads.begin();
if (m_Parallel_Audio)
threads.push_back(std::thread(Audio, 1));
if (m_Parallel_DDS)
threads.push_back(std::thread(DDS, 1, 1));
if (m_Parallel_HV)
threads.push_back(std::thread(HVgetShow, this, 3));
if (m_Parallel_Monitor)
threads.push_back(std::thread(MonitorgetShow, this));
if (m_Parallel_PDA)
threads.push_back(std::thread(PDAgetShow, this));
if (m_Parallel_Pulnix)
threads.push_back(std::thread(DoNothing, 1));
if (m_Parallel_Supertime)
threads.push_back(std::thread(MMCS,Sequence_id, static_cast<LPCSTR>(CStringA(loopnum))));
if (m_Parallel_Temp)
threads.push_back(std::thread(TempgetShow,this));
pvThread = threads.begin();
while (pvThread != threads.end())
pvThread->join();
pvThread++;
//update data on front panel
UpdateData(FALSE);
UpdateWindow();
//count selected tasks and output message
int j=0, count=0;
for(j=0; j<totTsk; j++)
if (select[j]) count++;
char buffer[2];
itoa (count,buffer,10);
string message=string(buffer)+" tasks completed in parallel\n";
TRACE(message.c_str()); //Message in debugging window
【问题讨论】:
发布的代码中似乎没有任何内存分配,因此内存泄漏几乎肯定发生在您启动的线程之一运行的函数之一中。 @Chad 谢谢乍得。我只用一个线程和一个简单的无操作函数测试了代码,如下所示,看到了类似的内存泄漏,这让我想知道我是否有任何设置错误。奇怪的是,我在执行结束时收到了一条消息,它比预期的更早弹出。 void DoNothing() //测试函数 //什么都不做 看起来我添加的线程与 MFC 对话框的线程有冲突。顺便说一句,代码块可以在非 GUI 项目下运行就好了。 【参考方案1】:代码
pvThread = threads.begin();
while (pvThread != threads.end())
pvThread->join();
pvThread++;
对我来说似乎有问题。第一次进入此循环时,当前线程(我假设它是主应用程序 UI 线程)将在第一个线程上调用 join() 时阻塞,直到该线程完成。如果第一个线程至少比其他一些线程花费的时间更长,那么最终你会发现自己在一个已失效的线程上调用了 join()。也许系统在处理这个问题时泄漏了一些东西?
【讨论】:
谢谢 pnswdv。这似乎很可能是问题所在。你有什么提示可以解决这个问题吗?检测到内存泄漏!转储对象 -> 389 位于 0x00631518 的普通块,56 字节长。数据: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 对象转储完成。 如果有人感兴趣,上面的问题是用 MFC 库中的 AfxBeginThread 解决的,而不是直接使用线程。以上是关于带有线程的 MFC 应用程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
可以直接将字符串作为参数传递会导致 C++ 中的内存泄漏吗?
在没有 3rd 方工具/项目的 MFC C++ 版本中查找内存泄漏