news 2026/6/17 11:16:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++智能指针定制删除器

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

智能指针的自定义删除器扩展了智能指针的功能,使其不仅可以管理内存,还能管理文件句柄、套接字、数据库连接等资源。

unique_ptr支持自定义删除器作为模板参数。

#include
#include
#include

struct 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 _WIN32
closesocket(*sock);
#else
close(*sock);
#endif
std::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的通用实现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 10:57:01

微信网页版终极方案:wechat-need-web插件技术深度解析与实战指南

微信网页版终极方案&#xff1a;wechat-need-web插件技术深度解析与实战指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否经常遇到微信网页版…

作者头像 李华
网站建设 2026/6/17 10:42:59

深蓝词库转换:一键解决30+输入法格式兼容问题

深蓝词库转换&#xff1a;一键解决30输入法格式兼容问题 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而丢失多年积累的词库&#xff1f;…

作者头像 李华
网站建设 2026/6/17 10:39:50

嵌入式处理器技术演进与飞思卡尔实战解析:从架构选型到系统设计

1. 嵌入式处理器&#xff1a;从“大脑”到“神经系统”的进化 在电子设备无处不在的今天&#xff0c;我们很少会去思考一个智能设备是如何“思考”和“行动”的。无论是汽车引擎的精准控制、工厂机械臂的流畅运转&#xff0c;还是智能家居的自动响应&#xff0c;其背后都离不开…

作者头像 李华
网站建设 2026/6/17 10:35:48

袁东申论课程百度云|领跑营|超大杯

袁东申论课程百度云|领跑营|超大杯资料全科都有袁东申论课程百度云 PDFhttps://tool.nineya.com/s/1jr3ck8t3 【数学真题】1. 已知 P(A)0.6&#xff0c;P(B)0.5&#xff0c;P(A∩B)0.3&#xff0c;则 P(A|B)&#xff08; &#xff09; A. 0.6 B. 0.5 C. 0.3 D. 0.8 答案&#x…

作者头像 李华
网站建设 2026/6/17 10:30:58

GPT-4 Turbo实战指南:长上下文、工具调用与成本优化

1. 项目概述&#xff1a;这不是一次普通升级&#xff0c;而是一次推理范式的迁移“未来已来&#xff0c;最新发布的chatgpt-4.0turbo即将改变世界”——这句话乍看像营销口号&#xff0c;但作为连续三年深度参与大模型应用落地的从业者&#xff0c;我拆解过GPT-4 Turbo的API响应…

作者头像 李华