Answers/Solutions to Exercises in Chapter 8, Exercise 8
E8: \What will happen in the following C++ program if the display statement in main() is uncommented and the program is recompiled and executed? Can you describe the output?
class A {
public:
char* heap_string;
char* stack_string;
A() { heap_string = stack_string = 0; }
void AttHStr(char* x) { heap_string = x; }
void AttSStr(char* x) { stack_string = x; }
friend ostream& operator<< (ostream& os,const A& a) {
os << "heap string=\"" << a.heap_string << "\"\n";
os << "stack string=\"" << a.stack_string << "\"\n";
return os;
}
};
A a;
void doit()
{
char s[] = "..stack..";
a.AttSStr(s);
cout << a << '\n';
}
int main()
{
a.AttHStr(strdup("..heap.."));
doit();
// cout << a << '\n';
return 0;
}
A8: The global object a is created by compiler. The first statement of main() sets the a.heap_string to point to a the string "..heap.." that is on the system heap. Then comes the call to doit()that sets the a.stack_string to point to the string "..stack.." that is on the system stack, and the object a is displayed providing two messages on the screen
heap string="..heap.." stack string="..stack.."
When back in main(), the a.stack_string is in fact a dangling pointer. Thus the call to cout may produce any kind of garbage or even crash the program:
heap string="..heap.." stack string="Ç ?"
Back to Answers/Solutions Index Back to Answers/Solutions for Chapter 8 Index