This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

why am i running out of heap memory when i am freeing my linked list?

i am creating a user interface using the sh1106 driver for a 128x64 pixel oled screen. so every screen is a list of items to be scrolled; however almost every screen i am using a linked list for the list of elements. in one screen i am creating a linked list and freeing it for about 12 to 15 times but when i reach a number like that the malloc is returning NULL so that means the malloc is not able to find the memory space i need. but what could be the cause? could it be a memory leak from the way i am freeing the linked list? could it be that the memory free space has become too fragmented? if so why only this linked list is messing up?

thanks in advance for ur help guys! and if there is anything needs clearing up or u need some extra info let me now and ill post it.

the code is below: (please keep in mind that i am extracting information from database saved in flash)

void createNotesListFromDb(linkedListNotes_t **head){

notes_t notesStructure;
uint8_t tuningID = dbGetTuningID(instrumentRefID);
tuningRefID = tuningID;
tuningNotesCount = dbGetTuningNotesCount(tuningID);
nbrOfNoteNodes = 0;
char notesTransferArray[4];


for(uint8_t nmbr = 1;nmbr <= tuningNotesCount; nmbr++)
{
	notesStructure = dbGetNote(tuningID, nmbr);
	
	// the next part is to fill a new node with desired values and information
	linkedListNotes_t * newNoteNode;
	newNoteNode = (linkedListNotes_t*)malloc(sizeof(linkedListNotes_t));
	newNoteNode->index = notesStructure.index;
	newNoteNode->alteration = notesStructure.alteration;
	newNoteNode->octave = notesStructure.octave;
	newNoteNode->cents = notesStructure.cents;
	generateNoteName(notesTransferArray, notesStructure.index, notesStructure.alteration, notesStructure.octave);
	newNoteNode->name = (char*)malloc(strlen(notesTransferArray)+1);
	strcpy(newNoteNode->name, notesTransferArray);
	newNoteNode->next = NULL;
	
	*head = addNotesNodeToTail(*head, newNoteNode);
	
	nbrOfNoteNodes++;
}

}

void freeNotesList(linkedListNotes_t * head){

linkedListNotes_t * tmp = NULL;

while (head != NULL)
{
	tmp = head;
	head = head->next;
	tmp->next = NULL;
	free(tmp->name);
	tmp->name = NULL;
	free(tmp);
	tmp=NULL;
}

}

linkedListNotes_t * addNotesNodeToTail(linkedListNotes_t *head, linkedListNotes_t * newNode){

linkedListNotes_t * temp;

if (!head)
{
    head = newNode;
    return head;
}

temp = head;

while (temp->next)
	{
    temp = temp->next;
	}

temp->next = newNode;

return head;

}

Parents
  • Abhishek Satish is very much right after researching malloc enough, i managed to understand fragmentation and so on. that was the problem.. there was no memory leakage on my part.

    for this matter i utilized the nrf_malloc and used the mem_manager for that particular case and customized the memory blocks according to my needs.

    also managed to monitor the nrf_malloc and such functions through serial comm with a few #defines and added the sdk_config.h to the project and managed make sure there was no memory leaks.

    but not sure how to put the answer on this questions.. any ideas? do i make a new answer? not rlly sure what to do.

  • oh nice thanks man! in that case ill make that answer more elaborate and detailed.. i believe there needs to be more manuals and instructions for stuff like that (better documentation).

Reply Children
No Data
Related