Как очистить массив структуры в C, а затем освободить эту память? - PullRequest
1 голос
/ 21 марта 2012

Два вопроса:

  1. Как быстро очистить массив от структуры?
  2. Как освободить память, выделенную членом структуры?

Код:

struct sComputerNames
{
    TCHAR *sName;   // Using a pointer here to minimize stack memory.   
};

TCHAR *sComputer  = (TCHAR *) calloc(2048+1, sizeof(TCHAR));
struct sComputerNames sCN[4096] = {0};


_tcscpy(sComputer,L"PC1");
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR));
_tcscpy_s(sCN[0].sName,128,sComputer);


// What is a better way to clear out the structure array?
for (DWORD i=0;i<4096;i++)
{
    free(sCN[i].sName);
    sCN[i].sName=NULL;
}


// Assign a new value
_tcscpy(sComputer,L"PC2");
sCN[0].sName = (TCHAR *) calloc(128,sizeof(TCHAR));
_tcscpy_s(sCN[0].sName,128,sComputer);


free(sCN);sCN=NULL;     // Erroring here - how to free memory allocated by sCN's members?
free(sComputer);sComputer=NULL;

Спасибо!

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Очистить массив очень просто:

memset(sCN, 0, sizeof(sCN));

Что касается остального, у вас есть некоторая путаница с попыткой освободить sCN, который вы не использовали malloc (), и попыткой освободить множество имен, когда вы вызываете только calloc () для одного из них.

0 голосов
/ 21 марта 2012

Хотя некоторые библиотеки имеют heap_min или другие имена, которые будут сбрасывать пулы распределения, используемые m / calloc и free, вы делаете это очень правильно.

Имейте в виду, что пулы распределения наиболееобычно реализуется с использованием связанных списков размещения информационных узлов.В вашем примере будет грузовик с последовательными вызовами, следовательно, порядок, по которому вы освобождаетесь, должен быть таким же, каким вы распределили.Это означает, что бесплатный вызов найдет элемент в начале связанного списка, что минимизирует время поиска.

0 голосов
/ 21 марта 2012

Вы пытаетесь освободиться от заголовка структуры, но это не указатель, и если он были, вы все равно хотите сначала освободить память указателя sName.

Вы бы освободили sCN [idx] .sName - где idx будет назначен циклом for. Если вы хотите обнулить структуру - не понятно из вашего вопроса - вызовите memset, используя sCN [idx] в качестве начальный адрес, 0 в качестве заданного значения и sizeof (sCN [idx]) в качестве длины структуры.

Вы также должны освободить память sComputer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...