Sobes.tech
Middle

Ποιος είναι ο ρόλος των διαχωριστικών στους έξυπνους δείκτες;

sobes.tech AI

Απάντηση από AI

Οι διαχωριστές (deleters) στους έξυπνους δείκτες επιτρέπουν τον ορισμό προσαρμοσμένης λογικής για την απελευθέρωση του πόρου στον οποίο δείχνει ο έξυπνος δείκτης. Από προεπιλογή, το std::unique_ptr χρησιμοποιεί delete, και το std::shared_ptr χρησιμοποιεί delete ή delete[]. Ένας διαχωριστής μπορεί να είναι μια συνάρτηση, ένας functor ή μια έκφραση lambda.

Παραδείγματα:

std::unique_ptr με διαχωριστή λειτουργίας:

#include <cstdio> // Για 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 με διαχωριστή lambda:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "Απελευθέρωση πόρου\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr με διαχωριστή lambda:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Απελευθέρωση κοινόχρηστου πόρου\n"; delete p; });
// ...

Ο ρόλος των διαχωριστών είναι σημαντικός στα ακόλουθα σενάρια:

  • Διαχείριση πόρων εκτός μνήμης: Αρχεία, sockets δικτύου, χειριστές βάσεων δεδομένων κ.λπ.
  • Ρύθμιση της διαδικασίας απελευθέρωσης μνήμης: Για παράδειγμα, χρήση delete[] για πίνακες ή ομάδες αντικειμένων.
  • Επιπλέον λογική κατά την απελευθέρωση: Καταγραφή, καθαρισμός σχετικών δομών.

Για το std::unique_ptr, ο τύπος του διαχωριστή αποτελεί μέρος του τύπου του δείκτη, κάτι που μπορεί να δυσκολέψει τη δουλειά με πολυμορφισμό. Για το std::shared_ptr, ο τύπος του διαχωριστή δεν αποτελεί μέρος του τύπου του δείκτη, προσφέροντας μεγαλύτερη ευελιξία.