Download presentation
Presentation is loading. Please wait.
Published byEmory Blake Modified over 9 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.