当StrDup处于while循环时,如何一起使用Malloc和StrDup?

时间:2012-02-22 10:55:37

标签: c++ winapi visual-c++ malloc strdup

我这里有代码。我正在使用malloc为我的struct分配内存。虽然其他成员不必更改其值,但是在while循环中使用StrDup为此结构的一个成员分配了一个字符串。现在,当我使用StrDup时,我必须清理内存,否则会出现内存泄漏,但内存的清理会破坏我的struct malloc。我该怎么办?在此先感谢。

    do
    {
       if( pURL == NULL )
           break ;
       pData->URL = StrDupA(pURL) ;

    }while(pURL != NULL) ;

2 个答案:

答案 0 :(得分:1)

嗯,简单的答案是,在用pData->URL的结果替换它之前,您必须释放StrDupA。像这样:

pData->URL = NULL ;
do
{
    pURL = //Some Function Here
    LocalFree(pData->URL) ;
    pData->URL = StrDupA(pURL) ;
}while(pURL != NULL) ;

对于正在引发的异常,您在评论中指出某些时候pURLNULL。发生这种情况时StrDupA将失败。我无法真正建议你如何解决这个问题,因为我无法理解这段代码试图做的事情。

您很可能也会泄漏由指定pURL的函数创建的内存。

我无法理解为什么要使用StrDupA而不是C运行时提供的strdup。您正在从Shlwapi.dll调用StrDupA。这对我来说毫无意义。从C运行时调用一个,并使用旧的free()释放内存。

我也不明白为什么循环终止被设计为显然永远不会终止。除了这个单独的while循环之外,我没有看过你的任何代码。

答案 1 :(得分:0)

我找到了解决方案。 Malloc of Struct应该在do-while循环中完成,因为它将允许每个线程独立工作。现在唯一的问题是初始化pData-> hEvent和pData-> hSemaphore。

//Before entering do-while loop
hEvent = CreateEvent....;
hSemaphore = CreateSemaphore......;

//inside do-while loop
pData->hEvent = hEvent ;
pData->hSemaphore = hSemaphore ;

//Now in ClearMemory() Function
LocalFree(pData->URL) ;
free(pData) ;

因为所有线程都有自己的struct