Ποιος είναι ο ρόλος των διαχωριστικών στους έξυπνους δείκτες;
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, ο τύπος του διαχωριστή δεν αποτελεί μέρος του τύπου του δείκτη, προσφέροντας μεγαλύτερη ευελιξία.