CS 225 Lab #2 - Pointers, Copy Constructors, Destructors, and DDD Introduction to Copy Constructors A special kind of constructor in C++ Creates a new object as a copy of an existing one There exists an implicit copy constructor in all classes in C++ that do not define one Unfortunately, it only creates a shallow copy of all the data members This will create problems when a class has data that involves pointers to dynamic memory Idea of the Copy Constructor Shallow copy – used to copy direct values Deep copy – used to copy indirect values If you make a shallow copy of a pointer, you would have two pointers that point to the same location If you make a deep copy of a pointer, you will have two pointers that point to different locations but those locations have the same value Modifying the original object should not affect its copy or vice versa Using a Copy Constructor Explicit Use: Implicit Use #1: Building a(4); // standard constructor call Building b(a); // b is now a deep copy of a Building a(4); // standard constructor call Building b = a; // implicit call to the copy constructor Implicit Use #2: When an object is returned by value from a function Using a Copy Constructor (2) Common Misunderstanding: Building a(4); // standard constructor call Building b(3); // standard constructor call b = a; // does NOT call copy constructor The copy constructor is never called in this code The last line uses the assignment operator which may be overloaded in C++ Introduction to Destructors A special function that may be explicitly called, but it is automatically invoked when an object is destroyed Its purpose is to free up any resources that were acquired by the object Proper use of a destructor will help prevent memory leaks! Use of a Destructor For an object created on the stack: the destructor is automatically invoked when the object goes out of scope For an object that was dynamically allocated on the heap: the destructor called when the “delete” command is used on the object Debugging Oh noes!!! My program does not work. Debugging is how you figure out where a problem is in your code Can be done with cout statements IDE's Debuggers (gdb, ddd, etc.) Introduction to Debuggers Debuggers are an essential tool that any computer scientist should know how to use. They control the execution of a program Breakpoints are used to stop execution Status of memory can be checked at any desired instance of a program's execution Data Display Debugger (DDD) DDD is a free GUI for command line debuggers such as GDB It provides a much simpler interface than GDB DDD features interactive data display data structures are displayed as graphs A tool that you will find useful for this class and beyond Firing up DDD First write, compile, and link the code you wish to debug If your binary executable is called foo, then you can run DDD on foo by typing: “ddd foo” into the console Note that the binary executable should be in your working directory Also note that the binary executable must have been compiled with the debug option “-g” Using DDD Important Buttons: Run: begins program execution Step: continues execution to the next line of code (following any function calls) Next: continue execution to the next line of code (skipping over any function calls) Remember to set at least one breakpoint Using DDD (2) Debugging involves starting and stopping the execution of the program and peeking at the values of data in memory Use the Display command to display data as a graph Display Local Variables (Alt + L) Layout Graph (Alt + Y)