2012-02-22 1 views
-1

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

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

    }while(pURL != NULL) ; 
+1

C++? 'Strdup'? 'Malloc'? Этот парень нуждается в помощи, быстро! – Xeo

+0

Ваш код очень запутан. Вопрос, который вы задаете, включает функцию «MyThreadProc», которую вы не вызываете. Кажется, что имена указывают на то, что функция выполняется в другом потоке, и вы также, похоже, выполняете некоторую синхронизацию, но то, что действительно происходит, сложно сказать. Во всяком случае, вы можете использовать две разные схемы распределения памяти ('malloc' и' LocalAlloc'), но почему бы вам просто не придерживаться только одного из них? –

+2

MyThreadProc вызывается непрерывно. Пожалуйста, посмотрите комментарий ниже функции StrDupA. Я знаю, что происходит не так. Неправильно: Malloc структуры, а затем инициализирует элемент структуры с помощью StrDupA, а затем FreeAlloc - память. Это как-то мешает структуре mallocated memory. Можете ли вы сказать мне правильную процедуру освобождения памяти, выделенной StrDupA в этом случае? – Abhineet

ответ

1

Ну, простой ответ в том, что вы должны освободить 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().

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

+2

StrDupA для Ansi. Петля заканчивается, когда функция, получающая pURL, возвращает NULL.На самом деле это многопоточный код, поэтому предоставленное вами решение не будет работать. Он выкинет Необработанное исключение. Это то же самое, что и мой код. – Abhineet

+0

Я добавил еще несколько соображений в свой ответ, но я действительно не могу понять, что вы делаете. Обратите внимание, что если 'pURL' всегда' NULL' (и он должен быть для завершения цикла), то 'StrDupA' завершится с ошибкой. Пожалуйста, используйте обычную 'strdup', а не фиктивную функцию из shlwapi.dll. –

+0

Хотя я попытался ответить на этот вопрос, по существу невозможно ответить с полной уверенностью. Вы действительно должны сократить свой код до минимума перед публикацией, и вы должны четко указать, какие ошибки вы видите. –

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) ; 

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

+0

Это принятый ответ на вопрос выше? Sheesh! Почему мы пытаемся помочь? –

+0

@ Давид: Извините, на самом деле ваш ответ намного лучше моего. Я не знаю, что я думаю, чтобы выбрать свой собственный ответ. Немного жадности, я думаю :-) – Abhineet

+0

Хорошо, это круто. Я также предпочел бы, чтобы вопрос вернулся к его первоначальной форме. –