Sobes.tech
Middle

What is the role of dividers in smart pointers?

sobes.tech AI

Answer from AI

Deleters in smart pointers allow defining custom logic for releasing the resource pointed to by the smart pointer. By default, std::unique_ptr uses delete, and std::shared_ptr uses delete or delete[]. A deleter can be a function, a functor, or a lambda expression.

Examples:

std::unique_ptr with a function deleter:

#include <cstdio> // For fclose

void file_deleter(FILE* file) {
    if (file) {
        fclose(file);
    }
}

// ...
// std::unique_ptr<FILE, decltype(&file_deleter)> file_ptr(fopen("example.txt", "r"), &file_deleter);
// ...

std::unique_ptr with a lambda deleter:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "Deleting resource\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr with a lambda deleter:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Deleting shared resource\n"; delete p; });
// ...

The role of deleters is important in the following scenarios:

  • Managing resources other than memory: files, network sockets, database handlers, etc.
  • Customizing the memory release process: for example, using delete[] for arrays or object pools.
  • Additional logic during release: logging, cleaning up related structures.

For std::unique_ptr, the deleter type is part of the pointer's type, which can complicate polymorphism. For std::shared_ptr, the deleter type is not part of the pointer's type, providing greater flexibility.