C++智能指针定制删除器

C++智能指针定制删除器 C智能指针定制删除器智能指针的自定义删除器扩展了智能指针的功能使其不仅可以管理内存还能管理文件句柄、套接字、数据库连接等资源。unique_ptr支持自定义删除器作为模板参数。#include#include#includestruct FileDeleter {void operator()(FILE* fp) const {if (fp) {std::fclose(fp);std::cout File closed by custom deleter\n;}}};struct SocketDeleter {void operator()(int* sock) const {if (sock) {#ifdef _WIN32closesocket(*sock);#elseclose(*sock);#endifstd::cout Socket closed\n;delete sock;}}};void file_deleter_example() {std::unique_ptr file(std::fopen(test.txt, w));if (file) {std::fprintf(file.get(), Custom deleter example\n);}std::cout File will be automatically closed\n;}lambda自定义删除器。void lambda_deleter() {auto file_deleter [](FILE* fp) {if (fp) {std::fclose(fp);std::cout File closed by lambda deleter\n;}};std::unique_ptr file(std::fopen(lambda.txt, w), file_deleter);if (file) {std::fprintf(file.get(), Lambda deleter example\n);}}shared_ptr也支持自定义删除器。void shared_ptr_deleter() {auto deleter [](int* p) {std::cout Custom shared_ptr deleter\n;delete p;};std::shared_ptr ptr(new int(42), deleter);std::cout Value: *ptr \n;}shared_ptr的删除器类型擦除。void type_erased_deleter() {auto file std::shared_ptr(std::fopen(shared.txt, w),[](FILE* fp) {if (fp) {std::fclose(fp);std::cout File closed via shared_ptr\n;}});if (file) {std::fprintf(file.get(), Shared pointer file\n);}}自定义删除器管理SQLite连接。struct SQLiteDeleter {void operator()(void* db) const {if (db) {std::cout SQLite database closed\n;}}};void sqlite_example() {// std::unique_ptr db(sqlite3_open(:memory:));std::cout Database connection managed by smart pointer\n;}自定义删除器管理POSIX定时器。struct TimerDeleter {void operator()(timer_t* timer) const {if (timer) {timer_delete(*timer);delete timer;std::cout Timer deleted\n;}}};void timer_example() {std::unique_ptr timer(new timer_t);std::cout POSIX timer managed\n;}自定义删除器管理mmap内存映射。struct MMapDeleter {size_t length;explicit MMapDeleter(size_t len) : length(len) {}void operator()(void* ptr) const {if (ptr ptr ! MAP_FAILED) {munmap(ptr, length);std::cout Memory unmapped\n;}}};void mmap_example() {size_t size 4096;// void* ptr mmap(nullptr, size, PROT_READ | PROT_WRITE,// MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);// std::unique_ptr mem(ptr, MMapDeleter(size));std::cout Memory mapping would be managed by smart pointer\n;}带状态的删除器。class StatefulDeleter {std::string context_;public:explicit StatefulDeleter(std::string ctx) : context_(std::move(ctx)) {}void operator()(FILE* fp) const {if (fp) {std::fclose(fp);std::cout Closed file [ context_ ]\n;}}};void stateful_deleter_example() {StatefulDeleter deleter(important_data);std::unique_ptr file(std::fopen(stateful.txt, w), deleter);if (file) {std::fprintf(file.get(), Stateful deleter\n);}}自定义删除器在资源池中的应用。class ResourcePool {std::vector available_;public:struct PoolDeleter {ResourcePool* pool;explicit PoolDeleter(ResourcePool* p) : pool(p) {}void operator()(int* ptr) const {pool-release(ptr);}};std::unique_ptr acquire() {int* ptr;if (available_.empty()) {ptr new int(0);} else {ptr available_.back();available_.pop_back();}return std::unique_ptr(ptr, PoolDeleter(this));}void release(int* ptr) {available_.push_back(ptr);std::cout Resource returned to pool\n;}~ResourcePool() {for (auto* p : available_) delete p;}};void pool_deleter_example() {ResourcePool pool;{auto resource pool.acquire();*resource 42;std::cout Acquired: *resource \n;}}自定义删除器使智能指针能管理任何需要释放的资源是RAII的通用实现。