Managing Memory. (and low level Data Structures) Lectures 22, 23. Hartmut Kaiser.

Similar documents
Chapter 17 vector and Free Store

Chapter 17 vector and Free Store

Pointers and Memory 1

The vector Class and Memory Management Chapter 17. Bjarne Stroustrup Lawrence "Pete" Petersen Walter Daugherity Fall 2007

Chapter 17 vector and Free Store. Bjarne Stroustrup

Vector and Free Store (Pointers and Memory Allocation)

Abstract. Vector. Overview. Building from the ground up. Building from the ground up 1/8/10. Chapter 17 vector and Free Store

vector and Free Store

CE221 Programming in C++ Part 2 References and Pointers, Arrays and Strings

Pointers, Dynamic Data, and Reference Types

Chapter 18 Vectors and Arrays [and more on pointers (nmm) ] Bjarne Stroustrup

Lecture 14. No in-class files today. Homework 7 (due on Wednesday) and Project 3 (due in 10 days) posted. Questions?

PIC 10A Pointers, Arrays, and Dynamic Memory Allocation. Ernest Ryu UCLA Mathematics

a data type is Types

Vector and Free Store (Vectors and Arrays)

CS2141 Software Development using C/C++ C++ Basics

Pointer Basics. Lecture 13 COP 3014 Spring March 28, 2018

Lecture 2, September 4

Dynamic memory allocation

ALL ABOUT POINTERS C/C++ POINTERS

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 1/9/ Review. Here s a simple C++ program:

C Review. MaxMSP Developers Workshop Summer 2009 CNMAT

A brief introduction to C programming for Java programmers

The output: The address of i is 0xbf85416c. The address of main is 0x80483e4. arrays.c. 1 #include <stdio.h> 3 int main(int argc, char **argv) 4 {

Chapter 2. Procedural Programming

CS 61c: Great Ideas in Computer Architecture

C++ for Java Programmers

15. Pointers, Algorithms, Iterators and Containers II

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 8/19/ Review. Here s a simple C++ program:

C BOOTCAMP DAY 2. CS3600, Northeastern University. Alan Mislove. Slides adapted from Anandha Gopalan s CS132 course at Univ.

Goals of this Lecture

Pointers, Arrays and C-Strings

Pointers and References

[0569] p 0318 garbage

Introduction to Programming Using Java (98-388)

Outline. 1 Function calls and parameter passing. 2 Pointers, arrays, and references. 5 Declarations, scope, and lifetimes 6 I/O

Dynamic Allocation in C

CSCI-1200 Data Structures Fall 2017 Lecture 10 Vector Iterators & Linked Lists

For example, let s say we define an array of char of size six:

C++ Programming Chapter 7 Pointers

FORM 2 (Please put your name and form # on the scantron!!!!) CS 161 Exam II:

6. Pointers, Structs, and Arrays. 1. Juli 2011

FORM 2 (Please put your name and form # on the scantron!!!!)

6. Pointers, Structs, and Arrays. March 14 & 15, 2011

Short Notes of CS201

Dynamic arrays / C Strings

CS201 - Introduction to Programming Glossary By

FORM 1 (Please put your name and section number (001/10am or 002/2pm) on the scantron!!!!) CS 161 Exam II: True (A)/False(B) (2 pts each):

CSE 333 Midterm Exam July 24, Name UW ID#

Array Initialization

CS2255 HOMEWORK #1 Fall 2012

Object-Oriented Programming, Iouliia Skliarova

DYNAMIC ARRAYS; FUNCTIONS & POINTERS; SHALLOW VS DEEP COPY

Today s lecture. Pointers/arrays. Stack versus heap allocation CULTURE FACT: IN CODE, IT S NOT CONSIDERED RUDE TO POINT.

Exercise: Inventing Language

Object-Oriented Programming, Iouliia Skliarova

Administrivia. Introduction to Computer Systems. Pointers, cont. Pointer example, again POINTERS. Project 2 posted, due October 6

Final CSE 131B Spring 2004

Principles of Programming Pointers, Dynamic Memory Allocation, Character Arrays, and Buffer Overruns

G52CPP C++ Programming Lecture 3. Dr Jason Atkin

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 13, FALL 2012

CSCI-1200 Data Structures Fall 2017 Lecture 5 Pointers, Arrays, & Pointer Arithmetic

Arrays and Memory Management

Pointers. Pointer References

Type Aliases. Examples: using newtype = existingtype; // C++11 typedef existingtype newtype; // equivalent, still works

Pointers and Dynamic Memory Allocation

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Documentation. Programming / Documentation Slide 42

INITIALISING POINTER VARIABLES; DYNAMIC VARIABLES; OPERATIONS ON POINTERS

377 Student Guide to C++

C-String Library Functions

Understanding Pointers

Arrays. Returning arrays Pointers Dynamic arrays Smart pointers Vectors

Errors. Lecture 6. Hartmut Kaiser hkaiser/fall_2011/csc1254.html


CSCI 171 Chapter Outlines

Pointers in C/C++ 1 Memory Addresses 2

High Performance Programming Programming in C part 1

CSE 333 Midterm Exam Sample Solution 7/28/14

Chapter 3 Objects, Types, and Values

14. Pointers, Algorithms, Iterators and Containers II

Programming in C. Pointers and Arrays

CS61C Machine Structures. Lecture 3 Introduction to the C Programming Language. 1/23/2006 John Wawrzynek. www-inst.eecs.berkeley.

for (i=1; i<=100000; i++) { x = sqrt (y); // square root function cout << x+i << endl; }

Chapter 10. Pointers and Dynamic Arrays. Copyright 2016 Pearson, Inc. All rights reserved.

Lecture 9. Pointer, linked node, linked list TDDD86: DALP. Content. Contents Pointer and linked node. 1.1 Introduction. 1.

Pointers and Terminal Control

Name MULTIPLE CHOICE. Choose the one alternative that best completes the statement or answers the question.

CS107 Handout 08 Spring 2007 April 9, 2007 The Ins and Outs of C Arrays

Pointers. Pointers. Pointers (cont) CS 217

Absolute C++ Walter Savitch

CSCI-1200 Data Structures Spring 2018 Lecture 10 Vector Iterators & Linked Lists

Topic 8: Lazy Evaluation

211: Computer Architecture Summer 2016

CSCI-1200 Data Structures Fall 2013 Lecture 9 Iterators & Lists

Pointers. 1 Background. 1.1 Variables and Memory. 1.2 Motivating Pointers Massachusetts Institute of Technology

Pointers and Arrays CS 201. This slide set covers pointers and arrays in C++. You should read Chapter 8 from your Deitel & Deitel book.

Topics so far. Review. scanf/fscanf. How data is read 1/20/2011. All code handin sare at /afs/andrew/course/15/123/handin

Lecture 15a Persistent Memory & Shared Pointers

Memory Corruption 101 From Primitives to Exploit

Transcription:

Managing Memory (and low level Data Structures) Lectures 22, 23 Hartmut Kaiser hkaiser@cct.lsu.edu http://www.cct.lsu.edu/ hkaiser/spring_2015/csc1254.html

Programming Principle of the Day Avoid Premature Optimization Don t even think about optimization unless your code is working, but slower than you want. Only then should you start thinking about optimizing, and then only with the aid of empirical data. "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" - Donald Knuth. http://en.wikipedia.org/wiki/program_optimization 2

Low Level Data Structures We were using the standard library data structures containers How are these built? Low level language facilities and data structures Closer to computer hardware (in semantics and abstraction level) Why do we need to know how are these built? Useful techniques, applicable in other contexts More dangerous, require solid understanding Sometimes absolute performance matters 3

Pointers and Arrays Array is a kind of container, however it s less powerful and more dangerous Pointers are kind of random access iterators for accessing elements of arrays Pointers and Arrays are the most primitive data structures available in C/C++ Closely connected concepts, inseparable in real world usage 4

Pointers A pointer is a value representing the address of an object Every distinct object has a distinct address denoting the place in memory it lives If it s possible to access an object it s possible to retrieve its address For instance: x // if x is an object &x // then &x is the address of this object p // if p is the address of an object *p // then *p is the object itself 5

Pointers The & is the address-of operator Distinct from defining reference types! The * is the dereference operator Same as for any other iterator as well If p contains the address of x we say that the pointer p points to x p x Pointers are built-in data types which need to be initialized in order to be meaningful 6

Pointers Initialize to zero means point to no object Null pointer (special value, as no object has this address) C++11: nullptr Pointers have types! The address of an object of type T is pointer to T Written as: T* For instance: int x; int *p; int* p; // object of type int // pointer to an int, *p has type int // pointer to an int, p has type int* 7

Pointers A small (but full) example: int main() { int x = 5; // p points to x int* p = &x; cout << "x = " << x << endl; p x: 5 // change the value of x through p *p = 6; p x: 6 } cout << "x = " << x << endl; return 0; 8

Pointers Think of pointers to be iterators They point to the single object stored in a virtual (nonexistent) container 9

Arrays Part of the language rather than standard library Hold sequence of elements of the same type Size must be known at compile time No member functions, no embedded typedefs i.e. no size_type member, use std::size_t instead 3 dimensional point: double coords[3]; // or std::size_t const ndim = 3; double coords[ndim]; 10

Arrays Fundamental relationship between arrays and pointers Name of the array is interpreted as a pointer to its first element: *coords = 1.5; // set first element in coords to 1.5 11

Pointer Arithmetic Pointer is a random-access iterator If p points to the mth element of an array, then p+n points to the (m+n)th element of the array p-n points to the (m-n)th element of the array Further, as first element of array has number 0 coords+1 points to the second, and coords+2 points to the third element coords+3 points to the first element after the last Possible to use standard algorithms with arrays: vector<double> v; copy(coords, coords + ndim, back_inserter(v)); 12

Pointer Arithmetic Possible to initialize containers from arrays: vector<double> v(coords, coords + ndim); More generally, wherever we used v.begin() and v.end(), we can use a and a+n (a: array, n: size) If p and q are pointers Then p-q is the distance of the two pointers, which is the number of elements in between Further (p q) + q == p 13

Indexing If p points to the mth element of an array, then p[n] is the (m+n)th element, not its address Consequently, if a is an array, and n an integer, then a[n] refers to the nth element inside the array a. More formally, if p is a pointer, and n an integer, then p[n] is equivalent to *(p+n) In C++ indexing is not a property of arrays, but a corollary to the properties of pointers and arrays and the fact that pointers are random access iterators 14

Array Initialization Historically, arrays can be initialized easily: int const month_lengths[] = { // we will deal elsewhere with leap years 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; No size specified, it s automatically calculated If size is specified, missing elements are set to zero (valueinitialized) C++11 allows the same syntax for containers std::vector<int> const month_lengths = { // we will deal elsewhere with leap years 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 15

String Literals Revisited String literals are character arrays with a trailing zero byte These are equivalent: char const hello[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; "Hello" Null character is appended to be able to locate the end of the literal Library has special functions dealing with C strings (string literals) 16

String Literals Revisited Find the length of a string literal ( C string): strlen // Example implementation of standard-library function size_t strlen(char const* p) { size_t size = 0; while (*p++!= '\0') ++size; return size; } Counting bytes (characters) excluding the null character 17

String Literals Revisited Variable hello and literal Hello are equivalent: string s(hello); string s("hello"); All will construct a string instance s holding Hello Pointers are iterators: string s(hello, hello + strlen(hello)); 18

Pointers and References Think of a reference as an automatically dereferenced pointer Or as an alternative name for an object A reference must be initialized The value of a reference cannot be changed after initialization int x = 7; int y = 8; int* p = &x; *p = 9; p = &y; // ok int& r = x; r = 10; r = &y; // error (and so is all other attempts to // change what r refers to) 19

Arrays of Character Pointers String literal is convenient way of writing address of first character of a null terminated string Arrays can be initialized conveniently Show how to initialize an array of character pointers from sequence of string literals Grading (again *sigh*): If the grade is at least 97 94 90 87 84 80 77 74 70 60 0 Then the letter grade is A+ A A- B+ B B- C+ C C- D F 20

Arrays of Character Pointers string letter_grade(double grade) { // range posts for numeric grades static double const numbers[] = { }; 97, 94, 90, 87, 84, 80, 77, 74, 70, 60, 0 // names for the letter grades static char const* const letters[] = { "A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D", "F" }; // compute the number of grades given the size of the array // and the size of a single element static size_t const ngrades = sizeof(numbers)/sizeof(numbers[0]); } // given a numeric grade, find and return the associated letter grade for (size_t i = 0; i < ngrades; ++i) { if (grade >= numbers[i]) return letters[i]; } return "?\?\?"; 21

Arguments to main() Command line arguments are optionally passed to main Alternative prototype for main(): int main(int argc, char** argv); argc: number of arguments argv: pointer to an array of character pointers, one argument each At least one argument: the name of the executable itself, thus argc >= 1 22

Arguments to main() Let s assume our executable is called say Invoking it as say Hello, world Should print: Hello, world int argc: 3 char ** argv char * argv[0] argv[1] argv[2] char s a y \0 H e l l o, \0 w o r l d \0 23

Arguments to main() int main(int argc, char** argv) { // if there are arguments, write them if (argc > 1) { int i; // declare i outside the for because we need // it after the loop finishes // write all but the last entry and a space for (i = 1; i < argc-1; ++i) cout << argv[i] << " "; // argv[i] is a char* cout << argv[i] << endl; // write the last entry // but not a space } return 0; } 24

Multiple Input Files Print the content of all files given on command line to console: int main(int argc, char** argv) { int fail_count = 0; // for each file in the input list for (int i = 1; i < argc; ++i) { ifstream in(argv[i]); // if it exists, write its contents, otherwise // generate an error message if (in) { string s; while (getline(in, s)) cout << s << endl; } else { cerr << "cannot open file " << argv[i] << endl; ++fail_count; } } return fail_count; } 25

The Computer s Memory As a program sees it Local variables live on the stack Global variables are static data The executable code are in the code section 26

Three Kinds of Memory Management Automatic memory management Local variables Allocated at the point of the definition De-allocated at the end of the surrounding scope Memory becomes invalid after that point: // this function deliberately yields an invalid pointer. // it is intended as a negative example don't do this! int* invalid_pointer() { } int x; return &x; // instant disaster! 27

Three Kinds of Memory Management Static memory management Memory allocated once Either at program startup (global variables) Or when first encountered (function-static variables) De-allocated at program termination: // This function is completely legitimate. int* pointer_to_static() { static int x; return &x; } Always returns pointer to same object 28

Three Kinds of Memory Management Dynamic memory management Allocate an instance of T with new T De-allocate an existing instance pointed to by p with delete p : int* p = new int(42); // allocate int, initialize to 42 ++*p; // *p is now 43, same as ++(*p) delete p; // delete int pointed to by p Another example: int* pointer_to_dynamic() { return new int(0); } 29

Allocating an Array Arrays of type T are dynamically allocated using new T[n], where n is the number of allocated elements De-allocation of an array pointed to by p is done using delete [] p n can be zero! (Why?) T* p = new T[n]; vector<t> v(p, p + n); delete[] p; Only way to create a dynamically sized array (remember, static array has to have size known at compile time) 30

A Problem: Memory Leak double* calc(int result_size, int max) { double* p = new double[max]; // allocate another max doubles // i.e., get max doubles from the free store double* result = new double[result_size]; // use p to calculate results to be put in result return result; } double* r = calc(200,100); // oops! We forgot to give the memory // allocated for p back to the free store Lack of de-allocation (usually called "memory leaks") can be a serious problem in real-world programs A program that must run for a long time can't afford any memory leaks 31

A Problem: Memory Leak double* calc(int result_size, int max) { int* p = new double[max]; // allocate max doubles // i.e., get max doubles from // the free store double* result = new double[result_size]; // use p to calculate results to be put in result delete[] p; // de-allocate (free) that array // i.e., give the array back to the // free store return result; } double* r = calc(200,100); // use r delete [] r; // easy to forget 32

Memory Leaks A program that needs to run "forever" can't afford any memory leaks An operating system is an example of a program that "runs forever" If a function leaks 8 bytes every time it is called, how many days can it run before it has leaked/lost a megabyte? Trick question: not enough data to answer, but about 130,000 calls All memory is returned to the system at the end of the program If you run using an operating system (Windows, Unix, whatever) Program that runs to completion with predictable memory usage may leak without causing problems i.e., memory leaks aren't "good/bad" but they can be a problem in specific circumstances 33

Memory Leaks Another way to get a memory leak void f() { double* p = new double[27]; // p = new double[42]; // delete[] p; } // 1st array (of 27 doubles) leaked p: 2 nd value 1 st value 34

Memory Leaks How do we systematically and simply avoid memory leaks? Don't mess directly with new and delete Use vector, etc. Or use a garbage collector A garbage collector is a program that keeps track of all of your allocations and returns unused free-store allocated memory to the free store (not covered in this course; see http://www.research.att.com/~bs/c++.html) Unfortunately, even a garbage collector doesn t prevent all leaks Use RAII, see next lecture 35