smart_pointers


Concept: smart pointers

In C++, smart pointers are a feature provided by the Standard Library to manage dynamically allocated memory automatically. They help prevent common issues like memory leaks and dangling pointers by ensuring that memory is automatically freed when it is no longer needed. The C++ Standard Library provides three primary smart pointers: - std::unique_ptr - std::shared_ptr - std::weak_ptr

Each of these smart pointers serves a different purpose and has distinct characteristics.

Example 1: std::unique_ptr

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass Constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass Destructor" << std::endl; }
};

int main() {
    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
    // std::unique_ptr<MyClass> ptr2 = ptr1;  // Error: Cannot copy unique_ptr
    std::unique_ptr<MyClass> ptr2 = std::move(ptr1);  // OK: Move ownership

    return 0;
}

Example 2: std::shared_ptr

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass Constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass Destructor" << std::endl; }
};

void useSharedPtr(std::shared_ptr<MyClass> ptr) {
    std::cout << "Using shared_ptr" << std::endl;
}

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr2 = ptr1;  // Shared ownership

    useSharedPtr(ptr1);

    std::cout << "Reference count: " << ptr1.use_count() << std::endl;  // Outputs: 2

    return 0;
}

Example 3: std::weak_ptr

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass Constructor" << std::endl; }
    ~MyClass() { std::cout << "MyClass Destructor" << std::endl; }
};

int main() {
    std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>();
    std::weak_ptr<MyClass> weakPtr = sharedPtr;  // Weak reference to sharedPtr

    if (std::shared_ptr<MyClass> lockedPtr = weakPtr.lock()) {
        std::cout << "Object is still alive" << std::endl;
    } else {
        std::cout << "Object has been destroyed" << std::endl;
    }

    return 0;
}

When to Use Each Smart Pointer

std::unique_ptr:

std::shared_ptr:

std::weak_ptr:

Summary

These smart pointers are fundamental tools in modern C++ for managing dynamically allocated resources safely and efficiently.

Previous Page | Course Schedule | Course Content