180 likes | 319 Views
ECE 264 Object-Oriented Software Development. Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation. Lecture outline. Announcements / reminders Contact your project groups—design due 11/19
E N D
ECE 264Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation
Lecture outline • Announcements / reminders • Contact your project groups—design due 11/19 • Meeting with project group next Wednesday in my office (during the lab session) regarding your project questions and design • 2:00-2:15 pm meeting with group 1 • 2:15-2:30 pm meeting with group 2 • 2:30-2:45 pm meeting with group 3 • 2:45-3:00 pm meeting with group 4 • Exam 2: 11/12 • Lab 7 due Tuesday, 11/06 • Today • Review: pointers • Basic usage • Pointer arithmetic • Common problems • Continue with pointers • Dynamic memory allocation • Destructors ECE 264: Lecture 24
Refresher on pointers • Allocators (malloc, new) return pointer to allocated space • Pointer: address of another object • We implicitly use these when we pass function arguments by reference in C++ • Can get address of existing object using & • Can get value of existing pointer using * • Pointer declaration: <base type>* <pointer name> • Base type determines how reference is interpreted • Be careful when declaring multiple pointers • Be sure to initialize pointer before use ECE 264: Lecture 24
Refresher on pointers, pt. 2 • Can assign pointers to one another; e.g. int x, *xp, *ip; xp = &x; ip = xp; • Array/pointer duality • Array name is pointer to first element • Can dereference array name (*arr) • Can treat pointers like arrays (ptr[i]) • Can perform pointer arithmetic on both • If ptr and arr point to first element of same array • ptr + i = arr + i = address of element arr[i] • ptr++ moves pointer to next array element • arr++ illegal: can’t change array name ECE 264: Lecture 24
Dynamic memory allocation • Up until now, allocated memory statically • Assumed we knew data size at compile time • What if data size is input-dependent and unknown until run time? • In C, dynamic memory allocation handled through mallocand free • In C++, we use newanddelete • Allocator (new) returns pointer to allocated space ECE 264: Lecture 24
Allocation with new • In C, malloc()allocates space on heap • malloc(sizeof(int))allocates space for 1 integer • malloc(20*sizeof(int))allocates an array of 20 integers • Both calls return pointer to first byte of element • In C++, we use new • new intallocates space for 1 integer • new int[20] allocates an array of 20 integers • As with malloc(),newreturns pointer to first byte • Directly initialize with value in parentheses • e.g. new int(3) ECE 264: Lecture 24
Example int *iPtr; iPtr = new int; // 4 bytes are allocated // iPtr points to 1st byte double *dPtr; dPtr = new double[20]; // 160 bytes allocated // dPtr points to 1st byte heap iPtr dPtr 4 bytes allocated for single int variable 160 bytes allocated for 20 double variables ECE 264: Lecture 24
Dynamic allocation example int main() { int *iPtr, *jPtr, i; iPtr = new int; jPtr = new int(3); double *dPtr; dPtr = new double[6]; *iPtr = 7; cout << *iPtr << ',' << *jPtr << endl; for(i=0; i<6; i++) dPtr[i] = 5; for(i=0; i<6; i++) cout << (*dPtr)++ << ' '; cout << endl; for(i=0; i<6; i++) cout << dPtr[i] << ' '; return 0; } OUTPUT 7, 3 5 6 7 8 9 10 11 5 5 5 5 5 Why? ECE 264: Lecture 24
Dynamically allocated objects • May want to dynamically allocate objects • Ex. array of Points where size is unknown at compile time Point *pointArray; int numPoints; cin << numPoints; pointArray = new Point[numPoints]; • Ex. linked list data structure—to add an element to the list, must allocate new element class linkedList { private: int elem; linkedList *next; public: void addElement(int i) ... } void linkedList::addElement(int i) { next = new linkedList(i); } ECE 264: Lecture 24
Referencing objects through pointers • Recall: use dot operator (.) to reference members of object, e.g: Point p1; p1.setX(2); • With pointers, use -> linkedList *list1 = new linkedList; list1->addElement(2); ECE 264: Lecture 24
Deallocation with delete • Space allocated using new should be freed • In C, we used free() • In C++, we use delete • You should only use delete to free memory allocated by new • Any other use will result in an error ECE 264: Lecture 24
100 delete example int *ptr; ptr = new int (100); ptr delete ptr; //free the memory ptr • delete frees space on heap ... • ... but ptr still points to same address! • Solution: assign freed pointers to NULL: • ptr = NULL; ? ECE 264: Lecture 24
Example: delete with arrays double *dptr; const int SIZE = 10; dptr = new double[SIZE];//80 bytes for(int i=0; i<SIZE; ++i) cin >> dptr[i]; fun1(dptr, SIZE); // pass array to fun1 delete [] dptr; //free all 10 elements dptr = NULL; ECE 264: Lecture 24
Example: Dynamically resizing an array • to resize this so that the array called list has space for 5 more numbers int * list = new int[size]; • Create an entirely new array of the appropriate type and of the new size. int * temp = new int[size + 5]; • Copy the data from the old array into the new array (keeping them in the same positions). This is easy with a for-loop. for (int i = 0; i < size; i++) temp[i] = list[i]; • Delete the old array -- you don't need it anymore! delete [] list; // this deletes the array pointed to by "list" • Change the pointer. You still want the array to be called "list" (its original name), so change the list pointer to the new address. list = temp; ECE 264: Lecture 24
Example of pointer arguments void Swap(int *p1, int *p2); void main () { int x, y; cin >> x >> y; cout << x << " " << y << endl; Swap(&x,&y); // passes addresses of x and y explicitly cout << x << " " << y << endl; } void Swap(int *p1, int *p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } ECE 264: Lecture 24
Example of reference arguments void Swap(int &a, int &b); void main () { int x, y; cin >> x >> y; cout << x << " " << y << endl; Swap(x,y); // passes addresses of x and y implicitly cout << x << " " << y << endl; } void Swap(int &a, int &b) { int temp = a; a = b; b = temp; } ECE 264: Lecture 24
More example void main () { int r, s = 5, t = 6; int *tp = &t; r = MyFunction(tp,s); cout << r << "," << s << "," << t << endl; r = MyFunction(&t,s); cout << r << "," << s << "," << t << endl; r = MyFunction(&s,*tp); cout << r << "," << s << "," << t << endl; } int MyFunction(int *p, int i) { *p = 3; i = 4; return i; } Output (r, s, t) 4, 5, 3 4, 5, 3 4, 3, 3 ECE 264: Lecture 24
Final notes • Next time • Dynamic allocation code examples • Acknowledgements: this lecture borrows heavily from lecture slides provided with the following texts: • Deitel & Deitel, C++ How to Program, 8th ed. • Etter & Ingber, Engineering Problem Solving with C++, 2nd ed. ECE 264: Lecture 24