/
CMPT 225 Memory and C++ Pointers CMPT 225 Memory and C++ Pointers

CMPT 225 Memory and C++ Pointers - PowerPoint Presentation

ginocrossed
ginocrossed . @ginocrossed
Follow
345 views
Uploaded On 2020-06-24

CMPT 225 Memory and C++ Pointers - PPT Presentation

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

int node mori stack node int stack mori heap 2010 memory greg object january variable pointer integer arr references

Share:

Link:

Embed:

Download Presentation from below link

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.


Presentation Transcript

Slide1

CMPT 225

Memory and C++ Pointers

Slide2

Outline

C++ objects and memory

C++ primitive types and memory

Note: “primitive types” = int, long, float, double, char, …

January 2010

Greg Mori

2

Slide3

Dynamic 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

Slide4

Dynamic 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

Slide5

C++

January 2010

Greg Mori

5

Slide6

C++ 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

Slide7

Referring 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

;

Slide8

Heap 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

Slide9

C++ 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

Slide10

Heap 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

Slide11

C++ 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

Slide12

C++ 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;

Slide13

C++ 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

Slide14

C++ 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();

Slide15

C++ 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;

Slide16

C++ 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

Slide17

C++ Memory Pitfalls

January 2010

Greg Mori

17

Slide18

Taking 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

Slide19

C++ 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

Slide20

Stack 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

Slide21

C++ 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

Slide22

Memory Pitfalls

Two major bug types can result if mistakes are made

Memory leaks

Dangling pointersJanuary 2010

Greg Mori

22

Slide23

Memory 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

Slide24

C++ 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

Slide25

C++ 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

Slide26

Dangling 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

Slide27

C++ 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

Slide28

C++ 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

Slide29

References, the other way

January 2010

Greg Mori

29

Slide30

C++ References

There are two ways to do refer to things in C++:

Pointers

Which we just didReferencesJanuary 2010

Greg Mori

30

Slide31

C++ 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

Slide32

C++ 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;

Slide33

C++ 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

Slide34

C++ 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

();

Slide35

What 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;

}

Slide36

Summary

January 2010

Greg Mori

36

Slide37

Summary

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

Slide38

Summary

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

Slide39

Summary

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

Slide40

Readings

Carrano

Ch. 4.1

January 2010

Greg Mori

40