class TraceLifetime { public: TraceLifetime(const char* variable_name); // Create and print message. ~TraceLifetime(); // Destroy and print message. private: enum { max_objects_to_trace = 100 }; // Maximum number of objects to trace static char existing_objects[1+max_objects_to_trace]; // L = live; D = destroyed. static int total_created; int instance_number; // Creation sequence number. char var_name[21]; // Name of variable (first 20 chars + null) // This should be String, but I get an internal compiler error message when using String }; #include #include int TraceLifetime::total_created = 0; char TraceLifetime::existing_objects[1+TraceLifetime::max_objects_to_trace] = ""; TraceLifetime::TraceLifetime(const char* variable_name) : instance_number(total_created++) { // Copy first 20 characters of variable name strncpy(var_name, variable_name, 20); var_name[20] = '\0'; if (total_created <= max_objects_to_trace) { existing_objects[total_created-1] = 'L'; existing_objects[total_created] = '\0'; cout << existing_objects << " TraceLifetime constructed for " << var_name << "." << endl; } } TraceLifetime::~TraceLifetime() { if (instance_number < max_objects_to_trace) { existing_objects[instance_number] = 'D'; cout << existing_objects << " TraceLifetime destroyed for " << var_name << "." << endl; } } //main routines start here void f2() { cout << "-- f2 starts -- " << endl; TraceLifetime c("c"); throw "exception"; cout << "-- f2 ends -- " << endl; } void f1() { cout << "-- f1 starts -- " << endl; TraceLifetime a("a"); f2(); TraceLifetime b("b"); cout << "-- f1 ends -- " << endl; } int main() { cout << "-- main starts --" << endl; try { f1(); } catch(const char* dd) { cout << "Exception caught." <