320 likes | 431 Views
More on Dynamic Memory Allocation. Seokhee Jeon Department of Computer Engineering Kyung Hee University. Illustrations, examples, and text in the lecture note courtesy of Prof. David Bernstein, https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_cpp_dynamic-memory.php. Reminders.
E N D
More on Dynamic Memory Allocation Seokhee Jeon Department of Computer Engineering Kyung Hee University Illustrations, examples, and text in the lecture note courtesy of Prof. David Bernstein, https://users.cs.jmu.edu/bernstdh/web/common/lectures/slides_cpp_dynamic-memory.php
Reminders • Dynamically allocated memory is kept on the memory heap • Dynamically allocated memory can't have a "name" it must be referred by pointers • Declarations are used to statically allocate memory, the new operator is used to dynamically allocate memory
Returning Memory to the Heap • How Big is the Heap? • It can only contain as much physical memory as you have installed or as much virtual memory as your operating system can make available (if it supports virtual memory) • Running Out of Memory: • Most applications request memory from the heap when they are running • It is possible to run out of memory (you may even have gotten a message like "Running Low On Virtual Memory") • So, it is important to return memory to the heap when you no longer need it
Returning Memory to the Heap • Dangling Pointers: • The delete operator does not delete the pointer, it takes the memory being pointed to and returns it to the heap • It does not even change the contents of the pointer • Since the memory being pointed to is no longer available (and may even be given to another application), such a pointer is said to be dangling
Returning Memory to the Heap • Remember: • Return memory to the heap before undangling the pointer • What's Wrong with the Following: • ptr = NULL; • delete ptr;
Returning Memory to the Heap • What About Arrays? • You want to return all of the memory to the heap • So, a different form of the delete operator is needed • Also, the memory allocator must keep track of the size of the array
Memory Leak • Memory leaks when it is allocated from the heap using the new operator but not returned to the heap using the delete operator
Linked Lists in C and C++ CS-2303System Programming Concepts (Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel)
Note: elements are usually thesame type (but not always). Definitions • Linked List • A data structure in which each element is dynamically allocated and in which elements point to each other to define a linear relationship • Singly- or doubly-linked • Stack, queue, circular list
Note: payload may bemultiple members. payload payload payload payload next next next next Linked List struct listItem {type payload;struct listItem *next; };
Linked List (continued) • Items of list are usually same type • Generally obtained from new operator • Each item points to next item • Last item points to null • Need “head” to point to first item! • “Payload” of item may be almost anything • A single member or multiple members • Any type of object whose size is known at compile time • Including struct, union, char* or other pointers • Also arrays of fixed size at compile time (see p. 214)
Usage of Linked Lists • Not massive amounts of data • Linear search is okay • Sorting not necessary • or sometimes not possible • Need to add and delete data “on the fly” • Even from middle of list • Items often need to be added to or deleted from the “ends”
payload payload payload payload next next next next Linked List (continued) struct listItem {type payload;struct listItem *next; }; struct listItem *head;
payload payload payload payload payload next next next next next Adding an Item to a List struct listItem *p, *q; • Add an item pointed to by qafter item pointed to by p • Neither p nor q is NULL
payload payload payload payload payload next next next next next Adding an Item to a List listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p; }
payload payload payload payload payload next next next next next Adding an Item to a List listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p; }
payload payload payload payload payload next next next next next Adding an Item to a List Question: What to do if we cannotguarantee that p and q are non-NULL? listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p; }
Note test for non-null p and q payload payload payload payload payload next next next next next Adding an Item to a List (continued) listItem *addAfter(listItem *p, listItem *q){if (p && q) { q -> next = p -> next; p -> next = q;}return p; }
payload payload payload payload payload next next next next next What about Adding an Itembefore another Item? struct listItem *p; • Add an item before item pointed to by p (p != NULL)
What about Adding an Itembefore another Item? • Answer:– • Need to search list from beginning to find previous item • Add new item after previous item • This is needed in PA#3 • Insert item after earlier event times and before later ones • Need to search the list
payload payload payload payload prev prev prev prev next next next next In-class exercise:– how to add a new item q after a list item p Doubly-Linked List struct listItem {type payload;listItem *prev;listItem *next; }; struct listItem *head, *tail;
Other Kinds of List Structures • Queue — FIFO (First In, First Out) • Items added at end • Items removed from beginning • Stack — LIFO (Last In, First Out) • Items added at beginning, removed from beginning • Circular list • Last item points to first item • Head may point to first or last item • Items added to end, removed from beginning
payload payload payload payload next next next next Optional:– struct listItem *head; Circular List struct listItem *tail; listItem *addAfter (listItem *p, listItem *tail){if (p && tail) { p -> next = tail -> next; tail = p;} else if (p) { tail p -> next = p;} return tail; }