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 statements

  • Destructor called on exception

  • ⟶ no leaks

Two pointer classes available