Sobes.tech
Middle

Wat is de rol van delimiters in slimme indicatoren?

sobes.tech AI

Antwoord van AI

Deleters (deleters) in slimme pointers stellen je in staat om aangepaste logica te definiëren voor het vrijmaken van de bron waarnaar de slimme pointer wijst. Standaard gebruikt std::unique_ptr delete, en std::shared_ptr gebruikt delete of delete[]. Een deleter kan een functie, een functor of een lambda-uitdrukking zijn.

Voorbeelden:

std::unique_ptr met een functiedeletor:

#include <cstdio> // Voor 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 met een lambda-deletor:

#include <iostream>
#include <memory>

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

std::shared_ptr met een lambda-deletor:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Deelbare bron wordt verwijderd\n"; delete p; });
// ...

De rol van deleters is belangrijk in de volgende scenario's:

  • Beheer van bronnen anders dan geheugen: Bestanden, netwerk sockets, database handlers, enz.
  • Aanpassing van het geheugen vrijgaveproces: Bijvoorbeeld delete[] voor arrays of object pools.
  • Aanvullende logica bij vrijgave: Logging, het opschonen van gerelateerde structuren.

Voor std::unique_ptr is het type van de deleter onderdeel van het pointertype, wat het werken met polymorfisme kan bemoeilijken. Voor std::shared_ptr is het type van de deleter niet onderdeel van het pointertype, wat meer flexibiliteit biedt.