Presentation is loading. Please wait.

Presentation is loading. Please wait.

ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation.

Similar presentations


Presentation on theme: "ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation."— Presentation transcript:

1 ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation

2 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 12/15/2015 ECE 264: Lecture 24 2

3 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 determines how reference is interpreted  Be careful when declaring multiple pointers  Be sure to initialize pointer before use ECE 264: Lecture 24 312/15/2015

4 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 412/15/2015

5 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 malloc and free  In C++, we use new and delete  Allocator ( new ) returns pointer to allocated space 12/15/2015 ECE 264: Lecture 24 5

6 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 int allocates space for 1 integer  new int[20] allocates an array of 20 integers  As with malloc(), new returns pointer to first byte Directly initialize with value in parentheses  e.g. new int(3) ECE 264: Lecture 24 612/15/2015

7 Example int *iPtr; iPtr = new int;// 4 bytes are allocated // iPtr points to 1 st byte double *dPtr; dPtr = new double[20]; // 160 bytes allocated // dPtr points to 1 st byte ECE 264: Lecture 24 7 ? ? ? ? ? … ? heap iPtr dPtr 12/15/2015 4 bytes allocated for single int variable 160 bytes allocated for 20 double variables

8 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; } ECE 264: Lecture 24 8 OUTPUT 7, 3 5 6 7 8 9 10 11 5 5 5 5 5 Why? 12/15/2015

9 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 912/15/2015

10 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 1012/15/2015

11 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 1112/15/2015

12 ECE 264: Lecture 24 12 delete example int *ptr; ptr = new int (100); 100 ptr delete ptr;//free the memory ? ptr 12/15/2015 delete frees space on heap...... but ptr still points to same address!  Solution: assign freed pointers to NULL: ptr = NULL;

13 ECE 264: Lecture 24 13 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; 12/15/2015

14 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; 12/15/2015 ECE 264: Lecture 24 14

15 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 15

16 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 16

17 More example ECE 264: Lecture 24 17 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, 3, 3

18 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, 8 th ed. Etter & Ingber, Engineering Problem Solving with C++, 2 nd ed. 12/15/2015 ECE 264: Lecture 24 18


Download ppt "ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 24: Pointers and Dynamic Allocation."

Similar presentations


Ads by Google