40
CMPT 225 Memory and C++ Pointers

CMPT 225

  • Upload
    jody

  • View
    25

  • Download
    0

Embed Size (px)

DESCRIPTION

Memory and C++ Pointers. CMPT 225. Outline. C++ objects and memory C++ primitive types and memory Note: “primitive types” = int , long, float, double, char, …. Dynamic Memory Example (from cmpt225_2stack, Java). // Java code // in function, f … int arr []; arr = getOrdArray (5); - PowerPoint PPT Presentation

Citation preview

Page 1: CMPT 225

CMPT 225Memory and C++ Pointers

Page 2: CMPT 225

Outline

C++ objects and memory C++ primitive types and memory

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

January 2010 Greg Mori 2

Page 3: CMPT 225

Dynamic Memory Example (from cmpt225_2stack, Java)

// Java code

// in function, f …

int arr[];

arr = getOrdArray(5);

// …

… arrf

… null

ngetOrdArray

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 3Greg Mori

Page 4: CMPT 225

Dynamic Memory Example(from cmpt225_2stack, C++)// in function, f …

// C++ code

int *arr;

arr = getOrdArray(5);

// …

… arrf

… null

ngetOrdArray

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

Page 5: CMPT 225

C++

January 2010 Greg Mori 5

Page 6: CMPT 225

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 allowed▪ Hence, there needs to be C++ notation to

distinguish between the two

January 2010 Greg Mori 6

Page 7: CMPT 225

Referring to things in C++: Pointers

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

The first is pointers The * 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;

Page 8: CMPT 225

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 object

np = new Node();

January 2010

Page 9: CMPT 225

C++ Objects on Stack/Heap

n npf

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 stack

Node *np;

// new creates a Node object, in heap

// np points to this object

np = new Node();

Node object

January 2010 9Greg Mori

Page 10: CMPT 225

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

Page 11: CMPT 225

C++ Primitives on Stack/Heap

i ipf

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 heap

ip = new int;

January 2010 11Greg Mori

Page 12: CMPT 225

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 again

January 2010 Greg Mori 12

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

Page 13: CMPT 225

C++ Following Pointers

i ipf

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;

55

January 2010 13Greg Mori

Page 14: CMPT 225

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

Page 15: CMPT 225

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 stack

int i;

// ip is pointer to an integer variable, in stack

int *ip;

// ip refers to the memory where i resides

ip = &i;

Page 16: CMPT 225

C++ Obtaining Addresses

i ipf

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 resides

ip = &i;

*ip = 5;

January 2010 16Greg Mori

Page 17: CMPT 225

C++ Memory Pitfalls

January 2010 Greg Mori 17

Page 18: CMPT 225

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 delete▪ If it’s an array, call delete [ ], which calls delete on all array

elements

Bugs result if mistakes are made

January 2010 Greg Mori 18

Page 19: CMPT 225

C++ Delete

npf

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 np

delete np;

Node object

January 2010 19Greg Mori

Page 20: CMPT 225

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 them

January 2010 Greg Mori 20

Page 21: CMPT 225

C++ Stack Objects

// in function, f …

Node n;

g();

// …

… nf

… null

stack (static)

void g (){Node m;Node r;

}

heap (dynamic)

nodeObj

mg

nodeObj

r

nodeObj

delete is called on m and r

January 2010 21Greg Mori

Page 22: CMPT 225

Memory Pitfalls

Two major bug types can result if mistakes are made Memory leaks Dangling pointers

January 2010 Greg Mori 22

Page 23: CMPT 225

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 stack▪ Including global variables

There is no way to access the memory The system will not use the memory for another

object/variable Eventually, you might run out of memory

January 2010 Greg Mori 23

Page 24: CMPT 225

C++ Memory Leak

// in function, f …

g();

// …

…f

stack (static)

void g (){Node *m = new Node();

}

heap (dynamic)

mg

This memory is not accessible

Node object

January 2010 24Greg Mori

Page 25: CMPT 225

C++ Memory Leak?

// in function, f …

Node *n;

n = g();

// …

…f

stack (static)

Node * g (){Node *m = new Node();return m;

}

heap (dynamic)

mg

Node objectn

January 2010 25Greg Mori

Page 26: CMPT 225

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 else

▪ Which will likely happen, but the error symptoms can be confusing

January 2010 Greg Mori 26

Page 27: CMPT 225

C++ Dangling Pointer

// in function, f …

int *ip = new int;

int *jp = ip;

*ip = 5

delete ip;

// …

*jp = 6;

…f

stack (static) heap (dynamic)

This memory is not available

5ipjp

January 2010 27Greg Mori

Page 28: CMPT 225

C++ Dangling Pointer?

// in function, f …

Node *n;

n = g();

// …

…f

stack (static)

Node * g (){Node m;return &m;

}

heap (dynamic)

mg

nodeObj

n

This memory is not available

January 2010 28Greg Mori

Page 29: CMPT 225

References, the other way

January 2010 Greg Mori 29

Page 30: CMPT 225

C++ References

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

▪ Which we just did References

January 2010 Greg Mori 30

Page 31: CMPT 225

C++ References

C++ also has references in addition to pointers

References can be thought of as a restricted form of pointer A few differences, key ones:

▪ References cannot be NULL, pointers can▪ References cannot be reassigned, pointers can

▪ This means they must be assigned at declaration time

▪ Different syntax for access▪ Leads to cleaner code (but perhaps harder to understand)

January 2010 Greg Mori 31

Page 32: CMPT 225

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 stack

Node n;

// nr is a reference to a Node object, in stack

// nr refers to the object n

Node &nr = n;

Page 33: CMPT 225

C++ Objects on Stack/Heap

n nrf

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 2010 33Greg Mori

Page 34: CMPT 225

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 stack

Node 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();

Page 35: CMPT 225

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;

}

Page 36: CMPT 225

Summary

January 2010 Greg Mori 36

Page 37: CMPT 225

Summary

Where do variables go? C++

▪ If it’s a variable declaration, in stack▪ If it’s a new statement, in heap

▪ In C++, both primitive types and objects can go in either stack or heap

January 2010 Greg Mori 37

Page 38: CMPT 225

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

Page 39: CMPT 225

Summary

How do I manage memory? C++

▪ Call delete manually (or delete [ ] for arrays)▪ Watch out for bugs

Memory leaks (forgot to delete) Dangling pointers/references (deleted when you shouldn't

have)

January 2010 Greg Mori 39

Page 40: CMPT 225

Readings

Carrano Ch. 4.1

January 2010 Greg Mori 40