Zwalnianie pamięci ze struktury

0

Posiadam taką strukturę oraz funkcję, która zwalnia z niej pamięć. Jednak przy wywoływaniu tej funcji powstają wycieki pamięci. Wiem, ze składowa lastname jest alokowana dynamicznie. Czy zarezerwowaną dla niej pamięć nalezy zwolnić oddzielnie? Jak temu zaradzić? Z góry dziękuję za odpowiedź.

struct MY_DATA
{
	char* lastname;
	FIELD field;
	unsigned int year;

};

void MY_DATA_Free(void* ptr)

{
	struct MY_STUDENT* pDat = (struct MY_STUDENT*)ptr;
	if (pDat)
		free(pDat);
	
}
5

Tak, trzeba zwolnić oddzielnie.

if (pDat)
{
    free(pDat->lastname);
    free(pDat);
}
0

Czy zarezerwowaną dla niej pamięć nalezy zwolnić oddzielnie

Tak.

Jak temu zaradzić?

char* lastname wskazuje na jakiś obszar pamięci, przed zwolnieniem pDat, możesz zwolnić pamięć, na którą wskazuje lastname

1

@SpaceInvader:

lastname masz zwolnić wcześniej, przed zwolnieniem całej struktury

TZN wróć !!!!
Masz zwolnić, przy domniemaniu, że lastname pochodzi z alokowania, i że nie jest przypadkowe (niezainicjowane)

Niestety tzw modele pamięci w C są trudne, jest ich dużo, i błędem jest zwolnienie wskaznika który powstał ze zmiennej statycznej (a ze zmiennej na stosie, to już horrendalny wielokrotny błąd)

3

void MY_DATA_Free(void* ptr)

dlaczego nie

void MY_DATA_Free(struct MY_DATA *ptr)

i bez tego rzutowania?

0

Nie musisz tego konwertować na strukturę, skoro nie zwalniasz składowych:

void MY_DATA_Free(void* ptr)
{
    if(ptr) free(ptr);
}

Ale jeżeli zwalniasz to:

void MY_DATA_Free(void* ptr)
{
    if(!ptr) return;
    free(((struct MY_STUDENT*)ptr)->lastname);
    free(ptr);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1