100 likes | 233 Views
This lecture provides a comprehensive overview of classes, destructors, and dynamic data management in C++. It covers the concepts of shallow and deep copies, demonstrating the difference between simple assignments and deep copy mechanisms using copy constructors and dedicated copy functions. Detailed code examples illustrate how dynamic memory is allocated and deallocated properly, ensuring memory management best practices. By the end of this lecture, students will be equipped with the knowledge to handle dynamic data in their C++ programs effectively.
E N D
CS148 Introduction to Programming II Ayman Abdel-Hamid Department of Computer Science Old Dominion University Lecture 16: 3/24/2003 CS148 Spring 2003
Outline • Classes and dynamic data • Use of destructors • Shallow copy • Deep copy using a deep copy function • Deep copy using a copy-constructor CS148 Spring 2003
Dynamically Allocates data pointed to by msgStr Deallocates data pointed to by msgStr Destructors and Dynamic Data 1/2 When a class instance allocates dynamic data on the free store (using new) , a destructor is used to properly deallocate the previously allocated data (using delete) class Date { public: Date (int Mo, int Day, int Yr, const char* msgStr); void print(); ~Date(); //destructor invoked when a class object is destroyed private: int mo; int day; int yr; char* msg; }; CS148 Spring 2003
Free Store 4 15 2001 ‘X’ ‘y’ ‘Z’ ‘\0’ msg Free Store After the call to destructor Destructors and Dynamic Data 2/2 When a class instance allocates dynamic data on the free store (using new in a constructor) , a destructor is used to properly deallocate the previously allocated data (using delete) • Date::Date(int Mo, int Day, int Yr, const char* msgStr) • { • … • //allocate space for msg • msg = new char[strlen(msgStr) + 1]; • //copy the contents of msgStr into msg • strcpy (msg,msgStr); • } • Date::~Date() • { • delete [] msg; • } • void main () • { • //create an instance of class Date • Date date1 (4,15,2001,“XyZ"); • } CS148 Spring 2003
Free Store 5 5 4 16 15 16 2002 2001 2002 ‘X’ ‘X’ ‘A’ ‘A’ ‘y’ ‘y’ ‘B’ ‘B’ ‘Z’ ‘Z’ ‘C’ ‘C’ ‘\0’ ‘\0’ ‘D’ ‘D’ ‘\0’ ‘\0’ 5 Free Store 16 2002 Shallow copy • When using the built in assignment operator with class objects a shallow copy is performed. A shallow copy copies one class object to another without copying any pointed-to data • void main () • { • //create an instance of class Date • Date date1 (4,15,2001,“XyZ"); • Date date2 (5,16,2002,”ABCD”); • date1 = date2; • } What happens when the destructor is invoked when main function is exited? CS148 Spring 2003
Deep copy using a deep copy function 1/2 • A deep copy is an operation that not only copies one class object to another but also makes copies of any pointed-to data • Instead of built-in assignment operator use a deep copy function • //deep copy function • void Date::copyFrom (Date otherDate) • { • mo = otherDate.mo; • day = otherDate.day; • yr = otherDate.yr; • delete []msg; • msg = new char[strlen(otherDate.msg)+1]; • strcpy(msg,otherDate.msg); • } • void main () • { • //create an instance of class Date • Date date1 (4,15,2001,“XyZ"); • Date date2 (5,16,2002,”ABCD”); • date1.copyFrom(date2); • } • What happens when date2 is passed by value to copyFrom? • What happens when copyFrom is exited? • What happens when the destructor is called upon main function exit? CS148 Spring 2003
main function 5 4 15 16 Free Store 2001 2002 ‘X’ ‘A’ ‘y’ ‘B’ ‘Z’ ‘C’ ‘\0’ ‘D’ ‘\0’ copyFrom function 5 Copy of date2 Created using a shallow copy 16 2002 Deep copy using a deep copy function 2/2 • date1.copyFrom(date2); • By default, date2 is copied to the copyFrom function using a shallow copy • When copyFrom is exiting, date2 copy is destroyed prompting a call to the destructor • The destructor deallocates the original pointed-to char array CS148 Spring 2003
Deep copy using a copy-constructor • Include a copy-constructor Date (const Date & otherDate); • The copy constructor will be invoked when • Passing a copy of an argument to a parameter (pass by value) • Initialization in a variable declaration Date date3 = date2; • Returning an object as the value of a function return someObject; • //copy constructor • Date::Date (const Date& otherDate) • { • mo = otherDate.mo; • day = otherDate.day; • yr = otherDate.yr; • msg = new char[strlen(otherDate.msg)+1]; • strcpy(msg,otherDate.msg); • } • void main () • { • //create an instance of class Date • Date date1 (4,15,2001,“XyZ"); • Date date2 (5,16,2002,”ABCD”); • date1.copyFrom(date2); • } • The date2 copy will be created by invoking the copy-constructor on date2 CS148 Spring 2003
main function Free Store 4 15 2001 5 16 ‘X’ ‘A’ ‘A’ ‘y’ ‘B’ ‘B’ ‘Z’ ‘C’ ‘C’ ‘\0’ ‘D’ ‘D’ ‘\0’ ‘\0’ 2002 copyFrom function 5 Copy of date2 created using the copy-constructor 16 2002 Deep copy using a copy-constructor 2/2 • date1.copyFrom(date2); //in the presence of a copy-constructor • When copyFrom is exiting, date2 copy is destroyed prompting a call to the destructor • The destructor deallocates the dynamic char array created using the copy-constructor leaving the one pointed to by date2.msg intact CS148 Spring 2003
Summary • When dealing with classes and dynamic data provide the following functions • A destructor to deallocate dynamic data • A deep copy function that copies pointed-to data in addition to class object members • A copy-constructor to guarantee deep copying of class objects • If deep copying is not provided, the default is shallow copying which does not copy pointed-to data CS148 Spring 2003