In Section 1.12 we introduced pointers and demonstrated some of the basics of working with them. We now look at two short code examples to demonstrate some of the weird and dangerous things that can happen when pointers are not handled correctly.
Example 22.1. src/pointers/pathology/pathologydecls1.cpp
[ . . . . ] int main() { int a, b, c; <-- 1 int* d, e, f; <-- 2 int *g, *h; <-- 3 int* i, * j; <-- 4 return 0; }
|
Example 22.1 shows a few of the many ways one can declare pointers. A beginner would be forgiven for thinking the second line of main() creates three pointersafter all, in line one, similar syntax creates three integers. However, when multiple variables are declared on one line, the * type modifier symbol applies only to the variable that immediately follows it, not the type that precedes it. Since whitespace is ignored by the compiler, the location of whitespace can help or confuse the reader.
Example 22.2. src/pointers/pathology/pathologydecls2.cpp
[ . . . . ] int main() { int myint = 5; int *ptr1 = &myint; cout << "*ptr1 = " << *ptr1 << endl; int anotherint = 6; // *ptr1 = &anotherint; <-- 1 int *ptr2; <-- 2 cout << "*ptr2 = " << *ptr2 << endl; *ptr2 = anotherint; <-- 3 int yetanotherint = 7; int *ptr3; ptr3 = &yetanotherint; <-- 4 cout << "*ptr3 = " << *ptr3 << endl; *ptr1 = *ptr2; <-- 5 cout << "*ptr1 = " << *ptr1 << endl; return 0; } [ . . . . ]
|
Example 22.2 is broken up into three sections. Only the first and third sections are equivalent; the second contains a common beginner's mistake.
src/pointers/pathology> g++ pathologydecls2.cpp pathologydecls.cpp: In function 'int main()': pathologydecls.cpp:17: error: invalid conversion from 'int*' to 'int' src/pointers/pathology>
After commenting out the invalid conversion, we can try again.
*ptr1 = 5 *ptr2 = 1256764 *ptr3 = 7 *ptr1 = 6
The value of *ptr2 is unpredictable.
Dereferencing uninitialized pointers for read purposes is bad enough, but then we wrote to it. This is a form of memory corruption, which can cause problems later in the program's execution. Notice the inconsistent value that *ptr1 obtained from *ptr2.
Further Pointer Pathology with Heap Memory |
Part I: Introduction to C++ and Qt 4
C++ Introduction
Classes
Introduction to Qt
Lists
Functions
Inheritance and Polymorphism
Part II: Higher-Level Programming
Libraries
Introduction to Design Patterns
QObject
Generics and Containers
Qt GUI Widgets
Concurrency
Validation and Regular Expressions
Parsing XML
Meta Objects, Properties, and Reflective Programming
More Design Patterns
Models and Views
Qt SQL Classes
Part III: C++ Language Reference
Types and Expressions
Scope and Storage Class
Statements and Control Structures
Memory Access
Chapter Summary
Inheritance in Detail
Miscellaneous Topics
Part IV: Programming Assignments
MP3 Jukebox Assignments
Part V: Appendices
MP3 Jukebox Assignments
Bibliography
MP3 Jukebox Assignments