自定义c++++智能指针的删除器,是通过赋予智能指针在对象生命周期结束时释放资源的权力,以适应复杂资源管理需求。1. 对于std::unique_ptr,删除器类型是其类型定义的一部分,在编译时确定,提供更强类型安全性和运行时性能优化;2. 对于std::shared_ptr,删除器在构造时指定,所有共享同一资源的实例共用该删除器,提供运行时灵活性;3. 删除器可通过函数对象或lambda表达式实现,如关闭文件、释放非new分配内存、系统资源等;4. 处理删除器异常时,应在删除器内部捕获并处理异常,避免程序意外终止;5. unique_ptr适用于唯一所有权场景,shared_ptr适用于资源共享场景。

自定义 C++ 智能指针的删除器,本质上就是赋予智能指针在对象生命周期结束时,如何释放其所管理资源的权力。这允许我们超越默认的
delete

解决方案

C++ 智能指针(
std::unique_ptr
std::shared_ptr
立即学习“C++免费学习笔记(深入)”;
std::unique_ptr
unique_ptr
unique_ptr
std::shared_ptr
shared_ptr
shared_ptr
函数对象 (Functor)

函数对象是一个类,它重载了函数调用操作符
operator()
operator()
#include <iostream>
#include <memory>
// 自定义删除器:文件关闭
struct FileCloser {
void operator()(FILE* file) const {
if (file) {
fclose(file);
std::cout << "File closed.\n";
}
}
};
int main() {
// 使用函数对象作为删除器
std::unique_ptr<FILE, FileCloser> file(fopen("example.txt", "w"), FileCloser());
if (file) {
fprintf(file.get(), "Hello, world!\n");
} // 文件将在 file 离开作用域时自动关闭
return 0;
}在这个例子中,
FileCloser
FILE*
operator()
std::unique_ptr
std::unique_ptr<FILE, FileCloser>
FileCloser
FILE*
Lambda 表达式
Lambda 表达式提供了一种更简洁的方式来定义删除器,特别是对于简单的资源释放逻辑。
#include <iostream>
#include <memory>
int main() {
// 使用 Lambda 表达式作为删除器
std::unique_ptr<FILE, void(*)(FILE*)> file(fopen("example.txt", "w"), [](FILE* f){
if (f) {
fclose(f);
std::cout << "File closed by lambda.\n";
}
});
if (file) {
fprintf(file.get(), "Hello from lambda!\n");
}
return 0;
}这里,我们直接在
unique_ptr
unique_ptr
std::unique_ptr<FILE, void(*)(FILE*)>
std::shared_ptr
shared_ptr
shared_ptr
#include <iostream>
#include <memory>
int main() {
FILE* file = fopen("example.txt", "w");
if (!file) {
std::cerr << "Failed to open file.\n";
return 1;
}
// 使用 shared_ptr 和 Lambda 表达式
std::shared_ptr<FILE> sharedFile(file, [](FILE* f){
if (f) {
fclose(f);
std::cout << "File closed by shared_ptr.\n";
}
});
fprintf(sharedFile.get(), "Hello from shared_ptr!\n");
// 当 sharedFile 离开作用域时,文件将被关闭
return 0;
}在这个例子中,我们创建了一个
shared_ptr
FILE*
shared_ptr
当需要执行的资源释放操作不仅仅是简单的
delete
new
malloc
free
fclose
closesocket
Release
自定义删除器可以确保资源得到正确释放,避免内存泄漏和其他资源泄漏问题。
unique_ptr
shared_ptr
unique_ptr
shared_ptr
unique_ptr
unique_ptr
shared_ptr
shared_ptr
选择使用
unique_ptr
shared_ptr
unique_ptr
shared_ptr
如果删除器抛出异常,程序通常会终止。 这是因为在对象销毁过程中抛出异常可能会导致未定义的行为。 为了避免这种情况,应该确保删除器不会抛出异常,或者至少要捕获并处理所有可能抛出的异常。
一种常见的做法是在删除器中使用
try-catch
#include <iostream>
#include <memory>
struct BadFileCloser {
void operator()(FILE* file) const {
if (file) {
if (rand() % 2 == 0) {
fclose(file);
std::cout << "File closed.\n";
} else {
throw std::runtime_error("Simulated file close error!");
}
}
}
};
int main() {
FILE* file = fopen("example.txt", "w");
if (!file) {
std::cerr << "Failed to open file.\n";
return 1;
}
std::unique_ptr<FILE, void(*)(FILE*)> safeFile(file, [](FILE* f) {
try {
if (f) {
fclose(f);
std::cout << "File closed safely.\n";
}
} catch (const std::exception& e) {
std::cerr << "Exception during file close: " << e.what() << '\n';
// 可以选择记录错误日志或采取其他补救措施
} catch (...) {
std::cerr << "Unknown exception during file close!\n";
}
});
fprintf(safeFile.get(), "This will be closed safely (hopefully).\n");
return 0;
}在这个例子中,lambda删除器捕获了
fclose
请注意,即使捕获了异常,程序的状态也可能是不确定的。 因此,最好设计删除器,使其尽可能避免抛出异常。
以上就是怎样自定义C++智能指针的删除器 演示函数对象和lambda表达式的用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号