Introduction¶
Problems With Pointers¶
Most prominent pointer (memory management) related bugs
Memory leak
Double free
Even more so with exceptions
Alternate return path
Requires extra handling for resource cleanup
Problem: Expecting Ownership Tranfer, But Ownership Not Taken ⟶ Memory Leak¶
#include "crunch.h"
double f()
{
BigData* data = new BigData(1000, 'a');
double answer = crunch(data); // <-- expected to free but doesn't
return answer; // <-- MEMORY LEAK!
}
Problem: Not Expecting Ownership Transfer, But Ownership Taken ⟶ Double Free¶
#include "crunch.h"
double f()
{
BigData* data = new BigData(100, 'a');
double answer = crunch(data); // <-- unexpectedly frees data
delete data; // <-- DOUBLE FREE!
return answer;
}
Problem: Early Return ⟶ Memory Leak¶
#include "crunch.h"
double f()
{
BigData* data = new BigData(100, 'a');
std::optional<double> answer = crunch(data);
if (! answer.has_value())
return 666.0; // <-- MEMORY LEAK!
delete data;
return answer.value();
}
Problem: Exception ⟶ Memory Leak¶
#include "crunch.h"
double f()
{
auto data = new BigData(100, 'a');
double answer = crunch(data); // <-- throws -> MEMORY LEAK!
delete data;
return answer;
}
Solution: Pointer Classes¶
What if pointers could be objects?
Destructor called on
return
statementsDestructor called on exception
⟶ no leaks
Two pointer classes available