Module 10
Module 10
L
Partha Pratim
Das
Programming in Modern C++
E
Objectives &
Outline
Module M10: Dynamic Memory Management
T
Memory
Management in C
malloc & free
P
Memory
Management in
Partha Pratim Das
N
C++
new & delete
Array
Placement new Department of Computer Science and Engineering
Restrictions Indian Institute of Technology, Kharagpur
Overloading new
& delete [email protected]
Module Summary
All url’s in this module have been accessed in September, 2021 and found to be functional
Module M10
L
Partha Pratim
Das
• Explained the rules of operator overloading
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary
Module M10
L
Partha Pratim
Das
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary
Module M10
L
Partha Pratim
Das 1 Dynamic Memory Management in C
malloc & free
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
2 Dynamic Memory Management in C++
P
Memory
new and delete operator
Management in Dynamic memory allocation for Array
N
C++
new & delete Placement new
Array
Placement new Restrictions
Restrictions
Overloading new
& delete 3 Operator Overloading for Allocation and De-allocation
Module Summary
4 Module Summary
Module M10
L
Partha Pratim
Das
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary
Dynamic Memory Management in C
Module M10
C Program C++ Program
L
Partha Pratim
Das #include <stdio.h> #include <iostream>
#include <stdlib.h> #include <cstdlib>
E
Objectives & using namespace std;
Outline
T
Memory int main() { int main() {
Management in C int *p = (int *)malloc(sizeof(int)); int *p = (int *)malloc(sizeof(int));
malloc & free *p = 5; *p = 5;
P
Memory
Management in printf("%d", *p); // Prints: 5 cout << *p; // Prints: 5
N
C++
new & delete
Array
free(p); free(p);
Placement new
} }
Restrictions
Overloading new
• Dynamic memory management functions in stdlib.h header for C (cstdlib header for C++)
& delete • malloc() allocates the memory on heap or free store
Module Summary
• sizeof(int) needs to be provided
• Pointer to allocated memory returned as void* – needs cast to int*
• Allocated memory is released by free() from heap or free store
• calloc() and realloc() also available in both languages
Module M10
L
Partha Pratim
Das
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary
Dynamic Memory Management in C++
L
Partha Pratim
Das
Functions malloc() & free() operator new & operator delete
E
Objectives &
Outline #include <cstdlib>
using namespace std; using namespace std;
T
Memory
Management in C
malloc & free int main() { int main() {
P
int *p = (int *)malloc(sizeof(int)); int *p = new int(5);
Memory
Management in *p = 5;
cout << *p; // Prints: 5 cout << *p; // Prints: 5
N
C++
new & delete
Array free(p); delete p;
Placement new } }
Restrictions
Overloading new
& delete • Function malloc() for allocation on heap • operator new for allocation on heap
Module Summary
• sizeof(int) needs to be provided • No size specification needed, type suffices
• Allocated memory returned as void* • Allocated memory returned as int*
• Casting to int* needed • No casting needed
• Cannot be initialized • Can be initialized
• Function free() for de-allocation from heap • operator delete for de-allocation from heap
• Library feature – header cstdlib needed • Core language feature – no header needed
L
Partha Pratim
Das and de-allocate memory:
Functions malloc() & free() Functions operator new() & operator delete()
E
Objectives &
Outline
#include <iostream> #include <iostream>
T
Memory #include <cstdlib> #include <cstdlib>
Management in C
using namespace std; using namespace std;
malloc & free
P
Memory int main() { int main() {
Management in
int *p = (int *)malloc(sizeof(int)); int *p = (int *)operator new(sizeof(int));
N
C++
new & delete *p = 5; *p = 5;
Array
Placement new cout << *p; // Prints: 5 cout << *p; // Prints: 5
Restrictions
• Function malloc() for allocation on heap • Function operator new() for allocation on heap
• Function free() for de-allocation from heap • Function operator delete() for de-allocation from heap
There is a major difference between operator new and function operator new(). We explore this angle later
L
Partha Pratim #include <iostream> #include <iostream>
Das #include <cstdlib> using namespace std;
using namespace std;
E
Objectives &
Outline
int main() { int main() {
T
Memory int *a = (int *)malloc(sizeof(int)* 3); int *a = new int[3];
Management in C
malloc & free
a[0] = 10; a[1] = 20; a[2] = 30; a[0] = 10; a[1] = 20; a[2] = 30;
P
Memory for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
Management in
cout << "a[" << i << "] = " cout << "a[" << i << "] = "
N
C++
new & delete << a[i] << " "; << a[i] << " ";
Array
Placement new free(a); delete [] a;
Restrictions } }
Overloading new ----- -----
& delete a[0] = 10 a[1] = 20 a[2] = 30 a[0] = 10 a[1] = 20 a[2] = 30
Module Summary
L
Partha Pratim
Das // placement new in buffer buf
int *pInt = new (buf) int (3);
E
Objectives &
Outline
int *qInt = new (buf+sizeof(int)) int (5);
T
Memory int *pBuf = (int *)(buf + 0); // *pInt in buf[0] to buf[sizeof(int)-1]
Management in C
int *qBuf = (int *)(buf + sizeof(int)); // *qInt in buf[sizeof(int)] to buf[2*sizeof(int)-1]
malloc & free
P
cout << "Buf Addr Int Addr" << pBuf << " " << pInt << endl << qBuf << " " << qInt << endl;
Memory cout << "1st Int 2nd Int" << endl << *pBuf << " " << *qBuf << endl;
Management in
N
C++
new & delete int *rInt = new int(7); // heap allocation
Array cout << "Heap Addr 3rd Int" << endl << rInt << " " << *rInt << endl;
Placement new delete rInt; // delete integer from heap
Restrictions // No delete for placement new
Overloading new
}
& delete -----
• Placement operator new takes a buffer address to place objects
Buf Addr Int Addr
Module Summary • These are not dynamically allocated on heap – may be allocated on stack or heap or static,
001BFC50 001BFC50
wherever the buffer is located
001BFC54 001BFC54
• Allocations by Placement operator new must not be deleted
1st Int 2nd Int
3 5
Heap Addr 3rd Int
003799B8 7
Programming in Modern C++ Partha Pratim Das M10.11
Mixing Allocators and De-allocators of C and C++
Module M10
• Allocation and De-allocation must correctly match.
L
Partha Pratim
Das ◦ Do not free the space created by new using free()
◦ And do not use delete if memory is allocated through malloc()
E
Objectives &
Outline
These may results in memory corruption
T
Memory
Management in C
malloc & free Allocator De-allocator
P
Memory malloc() free()
Management in
operator new operator delete
N
C++
new & delete
Array
operator new[] operator delete[]
Placement new operator new() No delete
Restrictions
Overloading new
& delete • Passing NULL pointer to delete operator is secure
Module Summary • Prefer to use only new and delete in a C++ program
• The new operator allocates exact amount of memory from Heap or Free Store
• new returns the given pointer type – no need to typecast
• new, new[ ] and delete, delete[] have separate semantics
Programming in Modern C++ Partha Pratim Das M10.12
Operator Overloading for Allocation and De-allocation
Module M10
L
Partha Pratim
Das
E
Objectives &
Outline
T
Memory
Management in C
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary
Operator Overloading for Allocation and De-allocation
L
Partha Pratim using namespace std;
Das
E
Objectives &
Outline cout << "Overloaded new" << endl;
void *ptr = malloc(n); // Memory allocated to ptr. Can be done by function operator new()
T
Memory
Management in C return ptr;
malloc & free }
P
void operator delete(void *p) { // Definition of operator delete
Memory
Management in cout << "Overloaded delete" << endl;
free(p); // Allocated memory released. Can be done by function operator delete()
N
C++
new & delete }
Array int main() { int *p = new int; // Calling overloaded operator new
Placement new *p = 30; // Assign value to the location
Restrictions << *p << endl;
cout << "The value is :"
Overloading new delete p; // Calling overloaded operator delete
& delete } • operator new overloaded
Module Summary ----- • The first parameter of overloaded operator new must be size t
Overloaded new • The return type of overloaded operator new must be void*
The value is : 30 • The first parameter of overloaded operator delete must be void*
Overloaded delete • The return type of overloaded operator delete must be void
• More parameters may be used for overloading
• operator delete should not be overloaded (usually) with extra parameters
Programming in Modern C++ Partha Pratim Das M10.14
Program 10.09: Overloading
operator new[] and operator delete[]
Module M10 #include <iostream>
#include <cstdlib>
L
Partha Pratim using namespace std;
Das
void* operator new [] (size_t os, char setv) { // Fill the allocated array with setv
E
Objectives &
Outline void *t = operator new(os);
memset(t, setv, os);
T
Memory
Management in C
return t;
malloc & free }
P
void operator delete[] (void *ss) {
Memory
Management in
operator delete(ss);
}
N
C++
new & delete int main() {
Array char *t = new(’#’)char[10]; // Allocate array of 10 elements and fill with ’#’
Placement new
Restrictions cout << "p = " << (unsigned int) (t) << endl;
Overloading new for (int k = 0; k < 10; ++k)
& delete cout << t[k];
Module Summary
delete [] t;
} • operator new[] overloaded with initialization
----- • The first parameter of overloaded operator new[] must be size t
p = 19421992 • The return type of overloaded operator new[] must be void*
########## • Multiple parameters may be used for overloading
• operator delete [] should not be overloaded (usually) with extra parameters
Programming in Modern C++ Partha Pratim Das M10.15
Module Summary
Module M10
L
Partha Pratim
Das
• Understood the difference between new, new[] and delete, delete[]
E
Objectives &
Outline • Compared memory management in C with C++
T
Memory
Management in C • Explored the overloading of new, new[] and delete, delete[] operators
malloc & free
P
Memory
Management in
N
C++
new & delete
Array
Placement new
Restrictions
Overloading new
& delete
Module Summary