удаление двухмерного массива связанного списка, как?

У меня есть такая функция для удаления моей двухмерной структуры, но она не слишком быстрая, я думаю, что есть гораздо более быстрый способ сделать это (например, memset или что-то в этом роде), любая идея будет оценена;)

 void freeAlllistNode(LISTNODEPTR *sPtr[][10])
{   LISTNODEPTR temp;
for (char i = 0; i<19; i++){
for (char di = 0; di<10; di++){
while (sPtr[i][di] != NULL){
temp = *(sPtr[i] + di);
*(sPtr[i] + di) = temp->next;
free(temp);
}
}
}
}

И это мое определение структуры, на случай, если это необходимо

typedef struct listNode{
char* val ;
struct listNode *next;
}LISTNODE;
using LISTNODEPTR = LISTNODE*;

1

Решение

Нет. memset никогда не заменяет malloc / free ни при каких обстоятельствах. Они делают совершенно разные вещи. Предложение, которое memset может как-то заменить malloc / free — фундаментальное недопонимание того, как работает динамическая память и динамическое выделение области.

Единственное, что могло бы даже удаленно реализовать нечто подобное, это стандартные контейнеры библиотеки C ++ с пользовательским классом размещения. То есть, std::list, std::vectorи другие, и ни одна из этих реализаций списка ссылок вручную.

Стандартные контейнеры библиотеки C ++ принимают необязательный параметр шаблона, который задает пользовательский класс распределителя. Должен быть написан пользовательский класс распределителя, который управляет динамическим выделением памяти для контейнера, что-то вроде распределения больших кусков памяти, а затем кусочно распределяет их для каждого значения, помещенного в контейнер. Затем, когда контейнер будет уничтожен, вся выделенная память может быть удалена за несколько коротких, deletes.

Конечно, можно было бы также реализовать этот подход с помощью ручной реализации списка ссылок. Но в любом случае это большая работа, и пока вся эта работа должна быть сделана, зачем тратить впустую больше времени со списком ссылок вручную, просто используйте std::list,

4

Другие решения

Других решений пока нет …