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的通用实现。
C++智能指针定制删除器
张小明
前端开发工程师
微信网页版终极方案:wechat-need-web插件技术深度解析与实战指南
微信网页版终极方案:wechat-need-web插件技术深度解析与实战指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否经常遇到微信网页版…
2026论文降AI率必备清单:AI率92%暴降至5%!实测10款降AI率工具!免费降AIGC额度薅到爽!
2026 年各大高校和期刊平台的 AI 检测系统又升级了,知网 AIGC、维普 AI、万方智能检测三大平台的算法迭代速度越来越快,上个月能蒙混过关的改写方式,这个月直接就会被标红预警。单纯的同义词替换、语序调整早就不管用了,想要有效降…
深蓝词库转换:一键解决30+输入法格式兼容问题
深蓝词库转换:一键解决30输入法格式兼容问题 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而丢失多年积累的词库?…
嵌入式处理器技术演进与飞思卡尔实战解析:从架构选型到系统设计
1. 嵌入式处理器:从“大脑”到“神经系统”的进化 在电子设备无处不在的今天,我们很少会去思考一个智能设备是如何“思考”和“行动”的。无论是汽车引擎的精准控制、工厂机械臂的流畅运转,还是智能家居的自动响应,其背后都离不开…
袁东申论课程百度云|领跑营|超大杯
袁东申论课程百度云|领跑营|超大杯资料全科都有袁东申论课程百度云 PDFhttps://tool.nineya.com/s/1jr3ck8t3 【数学真题】1. 已知 P(A)0.6,P(B)0.5,P(A∩B)0.3,则 P(A|B)( ) A. 0.6 B. 0.5 C. 0.3 D. 0.8 答案&#x…
GPT-4 Turbo实战指南:长上下文、工具调用与成本优化
1. 项目概述:这不是一次普通升级,而是一次推理范式的迁移“未来已来,最新发布的chatgpt-4.0turbo即将改变世界”——这句话乍看像营销口号,但作为连续三年深度参与大模型应用落地的从业者,我拆解过GPT-4 Turbo的API响应…