У меня есть такая функция для удаления моей двухмерной структуры, но она не слишком быстрая, я думаю, что есть гораздо более быстрый способ сделать это (например, 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*;
Нет. memset
никогда не заменяет malloc / free ни при каких обстоятельствах. Они делают совершенно разные вещи. Предложение, которое memset
может как-то заменить malloc / free — фундаментальное недопонимание того, как работает динамическая память и динамическое выделение области.
Единственное, что могло бы даже удаленно реализовать нечто подобное, это стандартные контейнеры библиотеки C ++ с пользовательским классом размещения. То есть, std::list
, std::vector
и другие, и ни одна из этих реализаций списка ссылок вручную.
Стандартные контейнеры библиотеки C ++ принимают необязательный параметр шаблона, который задает пользовательский класс распределителя. Должен быть написан пользовательский класс распределителя, который управляет динамическим выделением памяти для контейнера, что-то вроде распределения больших кусков памяти, а затем кусочно распределяет их для каждого значения, помещенного в контейнер. Затем, когда контейнер будет уничтожен, вся выделенная память может быть удалена за несколько коротких, delete
s.
Конечно, можно было бы также реализовать этот подход с помощью ручной реализации списка ссылок. Но в любом случае это большая работа, и пока вся эта работа должна быть сделана, зачем тратить впустую больше времени со списком ссылок вручную, просто используйте std::list
,
Других решений пока нет …