Как использовать Malloc и StrDup вместе, когда StrDup находится в цикле while? - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть код здесь.Я использую malloc для выделения памяти моей структуре.Один член этой структуры получает строку с использованием StrDup внутри цикла while, хотя другим членам не нужно менять свои значения.Теперь, когда я использую StrDup, мне нужно очистить память, иначе будут утечки памяти, но очистка памяти повредит мою структуру malloc.Что я должен делать?Заранее спасибо.

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

    }while(pURL != NULL) ;

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Ну, простой ответ заключается в том, что вы должны освободить pData->URL перед тем, как заменить его результатом StrDupA.Например:

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

Что касается возбуждаемого исключения, в комментарии вы указываете, что в какой-то момент pURL равно NULL.Когда это произойдет, StrDupA потерпит неудачу.Я не могу по-настоящему посоветовать вам, как это исправить, потому что просто не могу понять, что пытается сделать этот код.

Возможно, вы также теряете память, созданную функцией, которая назначаетpURL.

Я не могу понять, почему хотел бы использовать StrDupA вместо strdup, который обеспечивает среда выполнения C.Вы звоните StrDupA из Shlwapi.dll.Это не имеет смысла для меня.Вызовите его из среды выполнения C и освободите память старым добрым free().

Я также не понимаю, почему завершение цикла разработано так, что оно никогда не завершается.И я не смотрел ни на один ваш код, кроме этого сингла do while.

0 голосов
/ 23 февраля 2012

Я нашел решение. 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) ;

Поскольку все потоки имеют свою собственную структуру

...