2014-01-06 2 views
0

Я просмотрел множество примеров односвязного списка, который работает как стек. Они имеют в общем следующем: Они всегда используют бесплатно на появившемся пункте в функции попа(), например:Связанный список без free() in pop()

struct Node 
{ 
struct Node *Next; 
}*Head; 

void pop() 
{ 
struct Node *cur_ptr=Head; 
    .... 
    Head = Head->Next; 
    // do something with cur_ptr 
    free(cur_ptr); 
    .... 
} 

ли мне всегда нужно использовать это правило? Могу ли я поместить элемент из списка без бесплатного элемента в функции pop? Я хочу добиться того, чтобы выделить список только один раз, когда запускается программа, и избегать освобождения памяти и выделения памяти в каждый раз, когда я вызываю pop, push function. Я хочу поп-элемент, использовать элемент и снова нажать его (в другой части программы) для повторного использования. С этим подходом что-то не так?

Спасибо, что заблаговременно за ваше мнение и помощь.

+0

Дизайн c (не C++) –

+0

Я согласен с @ DieterLücking, либо дизайн, либо тег вводят в заблуждение. Этот подход будет сильно отличаться в зависимости от истинного целевого языка. – Chad

ответ

3

Вы должны быть уверены, что освободите выделенную память, когда они вам больше не нужны, вот в чем смысл.

Если, случайно, вы теряете ссылку на динамически выделенный адрес, не освободив его, то вы будете иметь утечку памяти, а:

void pop() { 
    // get element from stack 
    // use it 
    // not call free 
} 

Это создаст утечку, если вы этого не сделаете сохраните адрес всплывающего элемента в любом месте.

Если вы хотите использовать выделенные элементы, то вы можете сделать это, и в этом случае вы не должны освободить их, например:

void push() { 
    struct Node *ptr = pop_unused_node(); 
    if (!ptr) // if no unused node is found then we need a new one 
     ptr = malloc(sizeof(struct Node)); 
    *ptr = data; 
    push(ptr); 
    } 

    void pop() { 
    struct Node *ptr = pop(); 
    // use data 
    push_unused_node(ptr); 
    } 

    void clearup() { 
    for each node in unused list 
     free(node); 
    for each node in stack 
     free(node); 
    } 
2

Я хотел бы надеяться, что все реализации вас» ve посмотрел также выделить узел в push().

Конечно, вы можете сделать свою собственную работу поп-музыки любым способом; пока вы не пренебрегаете свободными узлами, когда закончите с ними.

1

Почему вы не хотите освобождать память? Если вы не освободите память, тогда вы, в конце концов, просочитесь в память!

Кроме того, вы должны предпочесть new - free.

И, если вы хотите быть всем современным и C++ 'ish, тогда вы должны подумать об использовании std::stack.

1

Причина, по которой pop(), как правило, освобождает память, потому что это традиционный смысл: операция pop() - это последний раз, когда связанный список будет иметь возможность «видеть» элемент.

Большинство версий list не являются навязчивыми, поэтому вы сохраняете некоторый тип данных, о котором вы знаете, в list, но внутренние данные самого list неизвестны. В этом методе имеет смысл для list в тех реализациях, что «служебные данные» для этого объекта обычно выделяются в push(), делая pop() логическим местом для их освобождения.

Поскольку пользователи могут захотеть, чтобы проверить «следующий» элемент (без выскакивают его список) большинство реализаций имеют front() (или аналогичный) функцию-член, который позволяет для проверки следующего значения, а pop() просто удаляет этот элемент (и не имеет возвращаемого значения).

Навязчивая структура данных ставит больше ограничений на то, что может быть сохранено в ней, но также дает большую гибкость в отношении управления ручным управлением памятью (если это то, что вам нужно).

0

Причина, по которой все реализации, которые вы видели бесплатно, когда они выставляют значение, - это то, что они несут ответственность за это местоположение в памяти. Если вы выделяете что-либо, ваша работа должна быть освобождена.

Но это программирование. Компьютер будет делать все, что вы скажете, поэтому, если вы чувствуете, что это работает лучше для вас, сделайте это. Вы можете реализовать свой собственный класс связанного списка без выделения памяти или освобождения. Я, конечно, не рекомендовал бы этого, так как я думаю, что у вас возникнут проблемы с этим, чем если бы вы просто позволили классу классов распределять и освобождать, как это было предназначено, но, опять же, все зависит от вас.

Смежные вопросы