自定义删除器在智能指针中用于灵活扩展资源释放机制。1. 它解决默认delete操作的局限,如处理非new分配内存、系统资源释放、数组释放、额外清理操作及内存池管理;2. 实现方式包括函数指针、仿函数和lambda表达式,均可绑定到unique_ptr或shared_ptr;3. shared_ptr支持共享删除器,确保资源在所有引用销毁后正确释放;4. 使用时需注意性能开销,避免不必要的状态捕获并合理选择实现方式;5. 最佳实践包括匹配分配与释放方式、禁止异常抛出、编译检查及编写清晰文档。

自定义删除器在智能指针中扮演着资源释放的灵活扩展角色。它允许你超越默认的
delete

资源释放扩展方案

自定义删除器为智能指针提供了一种强大的资源释放机制,它通过允许用户定义资源释放的方式,扩展了智能指针的默认行为。
立即学习“C++免费学习笔记(深入)”;
delete
默认情况下,智能指针使用
delete
delete[]

new
new
malloc
delete
fclose
closesocket
delete
new[]
自定义删除器可以解决这些问题,它允许你指定一个函数或函数对象,该函数或函数对象将在智能指针销毁时被调用,从而释放所管理的资源。
实现自定义删除器的方式有很多种,最常见的是使用函数指针、函数对象(仿函数)或Lambda表达式。
1. 使用函数指针:
#include <iostream>
#include <memory>
void my_deleter(int* ptr) {
std::cout << "Deleting memory allocated with malloc." << std::endl;
free(ptr); // 假设 ptr 是通过 malloc 分配的
}
int main() {
int* data = (int*)malloc(sizeof(int));
if (data == nullptr) {
return 1;
}
*data = 10;
std::unique_ptr<int, void(*)(int*)> smart_ptr(data, my_deleter);
// smart_ptr 超出作用域时,my_deleter 将会被调用
return 0;
}2. 使用函数对象(仿函数):
#include <iostream>
#include <memory>
struct MyDeleter {
void operator()(int* ptr) const {
std::cout << "Deleting memory using custom deleter." << std::endl;
delete ptr;
}
};
int main() {
std::unique_ptr<int, MyDeleter> smart_ptr(new int(20));
// smart_ptr 超出作用域时,MyDeleter 的 operator() 将会被调用
return 0;
}3. 使用Lambda表达式:
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int, std::function<void(int*)>> smart_ptr(
new int(30),
[](int* ptr) {
std::cout << "Deleting memory using lambda." << std::endl;
delete ptr;
}
);
// smart_ptr 超出作用域时,lambda 表达式将会被调用
return 0;
}这些示例展示了如何使用不同的方式来定义自定义删除器,并将其与
unique_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
#include <iostream>
#include <memory>
void file_closer(FILE* fp) {
std::cout << "Closing file." << std::endl;
fclose(fp);
}
int main() {
FILE* fp = fopen("example.txt", "w");
if (fp == nullptr) {
perror("Error opening file");
return 1;
}
std::shared_ptr<FILE> file_ptr(fp, file_closer);
// 多个 shared_ptr 可以共享同一个 file_ptr,并在最后一个 shared_ptr 销毁时调用 file_closer
return 0;
}在这个例子中,
file_closer
shared_ptr
shared_ptr
file_closer
虽然自定义删除器提供了很大的灵活性,但也需要注意性能开销。特别是当使用Lambda表达式作为删除器时,Lambda表达式可能会捕获一些状态,这会导致智能指针的大小增加。
std::function
std::function
malloc
free
try-catch
static_assert
static_assert
总而言之,自定义删除器是智能指针的一个强大特性,它允许你灵活地管理各种类型的资源。通过合理地使用自定义删除器,可以提高代码的安全性、可维护性和可扩展性。
以上就是自定义删除器在智能指针中的应用 C++资源释放扩展方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号