Outline C objects and memory C primitive types and memory Note primitive types int long float double char January 2010 Greg Mori 2 Dynamic Memory Example from cmpt2252stack Java ID: 785939
Download The PPT/PDF document "CMPT 225 Memory and C++ Pointers" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
CMPT 225
Memory and C++ Pointers
Slide2Outline
C++ objects and memory
C++ primitive types and memory
Note: “primitive types” = int, long, float, double, char, …
January 2010
Greg Mori
2
Slide3Dynamic Memory
Example
(from cmpt225_2stack, Java)
//
Java code
// in function,
f
…
int arr[];arr = getOrdArray(5);// …
…
arr
f
…
null
…
n
getOrdArray
5
stack (static)
public int[] getOrdArray(int n){int arr[] = new int[n];for (int i = 0; i < arr.length; ++i){arr[i] = i * 2 + 1;}return arr;}
heap (dynamic)
1
3
5
7
9
arr
January 2010
3
Greg Mori
Slide4Dynamic Memory
Example
(from cmpt225_2stack, C++)
// in function,
f
…
// C++ code
int
*arr;arr = getOrdArray(5);// …
…
arr
f
…
null
…
n
getOrdArray
5
stack
int * getOrdArray(int n){int *arr = new int[n];for (int i = 0; i < n; ++i){arr[i] = i * 2 + 1;}return arr;
}
heap
1
3
5
7
9
arr
Slide5C++
January 2010
Greg Mori
5
Slide6C++ and Memory
In C++:
Both primitive types and objects can be allocated either on the stack or on the heap
Both primitive type and object value and reference variables are allowedHence, there needs to be C++ notation to distinguish between the two
January 2010
Greg Mori
6
Slide7Referring to things in C++: Pointers
There are two ways to refer to things in
C++
The first is pointersThe * character is used to denote a pointer
January 2010
Greg Mori
7
//
n is a Node object
Node n;
// n is a pointer to a Node object
Node *
n;
//
i is an integer variable
int
i;//
i is pointer to an integer variable
int *i
;
Slide8Heap vs. Stack Variables in C++
Variables in methods are allocated in stack memory
C++ uses the keyword
new to allocate space in the heap
Greg Mori
8
//
n
is a Node object, in stack
Node
n;// np
is a pointer to a Node variable, np is in stack
Node *
np;
// new creates a Node object, in heap
// np
points to this objectnp
= new Node();
January 2010
Slide9C++ Objects on Stack/Heap
n
np
f
null
…
stack
heap
Node object
//
n
is a Node object, in stack
Node
n
;
//
np
is a pointer to a Node variable,
np
is in stackNode *np;// new creates a Node object, in heap// np points to this objectnp = new Node();Node objectJanuary 2010
9Greg Mori
Slide10Heap vs. Stack Variables in C++
In C++, you can do the same with primitive types, e.g.:
int
Greg Mori
10
//
i
is an integer variable, in stack
int
i;
// ip is pointer to an integer variable, in stack
int
*ip;
// new creates an integer variable, in heap
ip = new int
;
January 2010
Slide11C++ Primitives on Stack/Heap
i
ip
f
null
…
stack
heap
?
//
i
is an integer variable, in stack
int
i
;
//
ip
is pointer to an integer variable, in stack
int *ip;// new creates an integer variable, in heapip = new int;January 201011Greg Mori
Slide12C++ Following Pointers
How do we access the contents of the thing a pointer points to?
This is called “dereferencing” a pointer
The * notation is used againJanuary 2010
Greg Mori
12
//
ip
is pointer to an integer variable, in stackint *
ip;// new creates an integer variable, in heap
ip = new
int;
// *
ip is the contents of the new integer
*ip = 5;
int i
= *ip;
Slide13C++ Following Pointers
i
ip
f
null
…
stack
heap
?
//
ip
is pointer to an integer variable, in stack
int
*
ip
;
// new creates an integer variable, in heap
ip
= new
int;// *ip is the contents of the new integer*ip = 5;int i = *ip;
5
5
January 2010
13
Greg Mori
Slide14C++ Following Pointers: Objects
There is a shorthand for following pointers and accessing object methods / variables
Uses the -> characters
January 2010
Greg Mori
14
//
np
is a pointer to a Node variable, np is in stack// new creates a Node object, in heap// np
points to this object
Node *np = new Node(5);
// both of these run the
getData method on the Node object
int
i = (*
np).getData();
int i =
np -> getData();
Slide15C++ Obtaining Addresses
C++ allows one to obtain the address of an existing object / variable
This is called “referencing”
Uses the & operator (“address of”)January 2010
Greg Mori
15
//
i
is an integer variable, in stackint i
;//
ip is pointer to an integer variable, in stack
int *ip
;
// ip
refers to the memory where i resides
ip
= &i;
Slide16C++ Obtaining Addresses
i
ip
f
null
…
stack
heap
5
//
i
is an integer variable, in stack
int
i
;
//
ip
is pointer to an integer variable, in stack
int *ip;// ip refers to the memory where i residesip = &i;*ip = 5;January 2010
16Greg Mori
Slide17C++ Memory Pitfalls
January 2010
Greg Mori
17
Slide18Taking Out the Trash in C++
Java does Garbage Collection for you
C++ you need to do it yourself
If you don’t want an object any longer, call deleteIf it’s an array, call delete [ ], which calls delete on all array elementsBugs result if mistakes are made
January 2010
Greg Mori
18
Slide19C++ Delete
np
f
null
…
stack
heap
//
np
is a pointer to a Node variable,
np
is in stack
// new creates a Node object, in heap,
np
points to this object
Node *
np
= new Node();
// delete frees the heap memory referred to by
npdelete np;Node objectJanuary 201019Greg Mori
Slide20Stack Objects?
In C++ objects can be in stack memory (unlike Java)
Delete is automatically called on them when a method returns
Don’t manually delete themJanuary 2010
Greg Mori
20
Slide21C++ Stack Objects
// in function, f …
Node
n
;
g
();
// …
…n
f
…
null
…
stack (static)
void
g (){
Node m;
Node r;
}
heap (dynamic)nodeObjmgnodeObjrnodeObj……delete is called on
m and rJanuary 2010
21
Greg Mori
Slide22Memory Pitfalls
Two major bug types can result if mistakes are made
Memory leaks
Dangling pointersJanuary 2010
Greg Mori
22
Slide23Memory Leaks
Memory leaks occur if there is heap memory which is not pointed to by
any
variable (at any scope)No pointers to the memory in the current method nor any below it on the stackIncluding global variablesThere is no way to access the memory
The system will not use the memory for another object/variableEventually, you might run out of memory
January 2010
Greg Mori
23
Slide24C++ Memory Leak
// in function, f …
g
();
// …
…
f
…
…
stack (static)
void
g ()
{ Node *
m = new Node();
}heap (dynamic)
m
g
…
…
This memory is not accessibleNode objectJanuary 201024Greg Mori
Slide25C++ Memory Leak?
// in function, f …
Node *
n
;
n
=
g
();// ……f
…
…
stack (static)
Node *
g (){
Node *m = new Node();
return m;
}
heap (dynamic)
m
g……Node objectnJanuary 201025Greg Mori
Slide26Dangling Pointers
Once you call delete, or a method returns, memory is gone
If you try to refer to this memory you will get an error*
If it is being used by something elseWhich will likely happen, but the error symptoms can be confusing
January 2010
Greg Mori
26
Slide27C++ Dangling Pointer
// in function, f …
int
*
ip
= new
int
;
int *jp = ip;*ip = 5delete ip;
// …*
jp = 6;
…
f
…
…
stack (static)
heap (dynamic)
This memory is not available
5
ipjpJanuary 201027Greg Mori
Slide28C++ Dangling Pointer?
// in function, f …
Node *
n
;
n
=
g
();// ……f
…
…
stack (static)
Node *
g (){
Node m;
return &m;
}
heap (dynamic)
m
gnodeObj……nThis memory is not availableJanuary 201028Greg Mori
Slide29References, the other way
January 2010
Greg Mori
29
Slide30C++ References
There are two ways to do refer to things in C++:
Pointers
Which we just didReferencesJanuary 2010
Greg Mori
30
Slide31C++ References
C++ also has
references
in addition to pointersReferences can be thought of as a restricted form of pointerA few differences, key ones:References cannot be NULL, pointers can
References cannot be reassigned, pointers canThis means they must be assigned at declaration timeDifferent syntax for access
Leads to cleaner code (but perhaps harder to understand)
January 2010
Greg Mori
31
Slide32C++ References Syntax
The & character is used to denote references
Yes, the same character as address-of
January 2010
Greg Mori
32
//
n
is a Node object, in stackNode
n;
// nr is a reference to a Node object, in stack// nr refers to the object n
Node &nr =
n;
Slide33C++ Objects on Stack/Heap
n
nr
f
null
…
stack
heap
Node object
//
n
is a Node object, in stack
Node
n
;
// nr is a reference to a Node object, in stack
// nr refers to the object
n
Node &nr = n;January 201033Greg Mori
Slide34C++ References Syntax cont.
References are used with same syntax as Java
Use the . character
January 2010
Greg Mori
34
//
n
is a Node object, in stackNode
n;// nr is a reference to a Node object, in stack
// nr refers to the object n
Node &nr =
n;
// both of these call the
getData() method on the Node
int
i = n.getData
();int
i = nr.getData
();
Slide35What are references for?
Often used for function / method parameters
“Pass by reference” vs. “Pass by value”
35
void
foo
(
int
x) { x=2;
}
int
main () {
int y = 4;
foo(y);
cout <<
y;
return 0;
}void foo (int& x) { x=2;}int main () {
int y
= 4;
foo(y);
cout <<
y;
return 0;
}
Slide36Summary
January 2010
Greg Mori
36
Slide37Summary
Where do variables go?
C++
If it’s a variable declaration, in stackIf it’s a new statement, in heapIn C++, both primitive types and objects can go in either stack or heap
January 2010
Greg Mori
37
Slide38Summary
How do I refer to variables?
C++
Pointers* notation* in type to denote "it's a pointer to a"* in usage to denote "follow this pointer to"
References& notation
January 2010
Greg Mori
38
Slide39Summary
How do I manage memory?
C++
Call delete manually (or delete [ ] for arrays)Watch out for bugsMemory leaks (forgot to delete)Dangling pointers/references (deleted when you shouldn't have)
January 2010
Greg Mori
39
Slide40Readings
Carrano
Ch. 4.1
January 2010
Greg Mori
40