我正在检查一些代码是否存在内存泄漏的问题,然后我想到了这种可能性。基本上我所做的伪代码如下:
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的清理)。当我发现关键部分无效时,我不能在
thread_func()
中释放fileName
。我的猜测是因为thread_func()
已失去对fileName
的访问权,因为主进程已退出。我的问题是,如果我在这种情况下不释放fileName
,是否存在内存泄漏的风险?我已经搜索了很多相关信息,但目前还没有找到任何有用的信息。如果有人能指点我方向/回答我的问题,我会非常高兴。
谢谢!
编辑:
根据kol的建议(见下面的答案),我决定进行一些初步测试。我注意到了一些非常奇怪的事情,我无法理解。现在我的代码如下:
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()
会无限期地挂起,导致我的GUI无响应。难道WaitForMultipleObjects()
不应该很快返回吗?此外,如果threadTerminated
为TRUE
,则thread_func()
中的所有清理都不会发生。在我看来,最奇怪的部分是,当我去掉
WaitForMultipleObjects()
时,我的代码就可以正常工作! 所有的清理工作都进行了,包括thread_func()
内部的清理。请问有人能帮我理解这个问题吗?请注意,我目前只在一个点检查
threadTerminated
。稍后我会在其他重要点上检查。我这样做只是想确认自己是否理解发生了什么。再次感谢! 你的回答非常有帮助。