我目前正在检查一些代码,我有内存泄漏,这种可能性让我感到震惊。基本上,我在做什么的伪代码如下所示,线程分配内存,主进程死亡,会发生什么?
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
此函数驻留在DLL中。关键部分和其他东西由同样驻留在同一个DLL中的函数初始化。
现在,我的主进程(这是一个GUI)有一个取消按钮。当用户点击该按钮时,我会调用DLL的清理函数,这个函数恰好会破坏我的关键部分。
我发现如果用户在执行thread_func()
期间点击取消,thread_func()
将继续执行。当它到达关键部分代码时,关键部分是无效的,所以我在那里退出。这是我如何检查线程内的取消事件(因为在执行thread_func()
期间,我的应用程序中没有其他任何东西可以调用DLL的清除)。
我不能免费fileName
在thread_func()
当我发现临界区无效。我的猜测是因为thread_func()
由于主进程退出而失去对fileName
的访问。我的猜测是对的吗?我的主要问题是,如果我在这种情况下没有免费使用fileName
,我是否会冒内存泄漏的风险?
我已经搜索了很多相关信息,到目前为止还没有找到任何东西。如果有人能指出我正确的方向/回答我的问题,我会非常高兴。
谢谢!
编辑:
,我决定做根据科尔的建议的一些初步测试(见下面的回答)。我注意到了一些我无法理解的奇怪东西。现在,我的代码如下:
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
if(threadTerminated)
{
/* Cleanup */
return;
}
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
而在我的GUI,我OnCancel事件处理程序是这样的:
void OnCancel()
{
threadTerminated = TRUE;
WaitForMultipleObjects(noOfRunningThreads, threadHandles, TRUE, INFINITE);
/* Other cleanup code */
}
我注意到,WaitForMultipleObjects()
无限期挂起我的图形用户界面变得无法响应。 WaitForMultipleObjects()
不应该快速返回?另外,如果threadTerminated
是TRUE
,则在thread_func()
中没有发生清理。
这是IMO最奇怪的部分。当我删除WaitForMultipleObjects()
时,我的代码工作得很好!所有的清理工作都会发生,包括thread_func()
内的清理。有人能帮我理解吗?
请注意,我现在只在一个点上检查threadTerminated
。稍后我会在其他重要的部分检查它。我只是为了看看我是否了解发生了什么。
再次感谢!你的回答非常有帮助。
有不同类型的内存泄漏,在不增加它往往是更不方便的不是一个实际的问题,因为程序终止反正和泄漏是不随时间增长泄漏的情况。 – 2013-02-13 15:12:14
@claptrap,好点!但是我想清除任何我发现的内存泄漏情况。 – 2013-02-13 16:06:37
如果仅在进程退出时调用DLL的清理函数,则不要打扰销毁关键部分。该建筑正在拆除,所以你不需要扫地。如果您需要处理DLL被卸载但进程将继续进行的情况,那么您需要根据现有答案将清理与线程同步。请记住,即使在没有关键部分的情况下,当线程仍在运行代码时,也无法安全地卸载DLL。 – 2013-02-13 22:07:15