1. 给std::unique_ptr
定制删除器
1.1 方法一,使用functor
#include <iostream>
#include <memory>
#include <stdio.h>
struct FileCloser{
void operator()(FILE* fp) const{
fclose(fp);
fp = nullptr;
std::cout << "file automatically closed.\n";
}
};
auto main()->int {
std::unique_ptr<FILE, FileCloser> pfile(fopen("1.txt", "w"));
}
1.2 方法二,使用函数指针
#include <iostream>
#include <memory>
#include <stdio.h>
auto main()->int{
std::unique_ptr<FILE, void(*)(FILE*)> pfile(fopen("2.txt", "w"), [](FILE* pf){fclose(pf); pf = nullptr; std::cout << "file automatically closed.\n";});
}
1.3 方法三,使用未求值的lambda
#include <iostream>
#include <memory>
#include <stdio.h>
auto main()->int{
std::unique_ptr<FILE, decltype([](FILE* fp){fclose(fp); fp = nullptr; std::cout << "file auto closed.\n";})> pfile(fopen("3.txt", "w"));
}
}
2. 给std::shared_ptr
定制删除器
2.1 方法一
#include <iostream>
#include <memory>
#include <stdio.h>
struct FileCloser{
void operator()(FILE* fp) const{
fclose(fp);
fp = nullptr;
std::cout << "file automatically closed.\n";
}
};
auto main()->int {
std::shared_ptr<FILE> pfile(fopen("1.txt", "w"), FileCloser());
}
2.2 方法二
#include <iostream>
#include <memory>
#include <stdio.h>
auto main()->int{
std::shared_ptr<FILE> pfile(fopen("2.txt", "w"), [](FILE* pf){fclose(pf); pf = nullptr; std::cout << "file automatically closed.\n";});
}
2.3 方法三
#include <iostream>
#include <memory>
#include <stdio.h>
auto main()->int{
std::shared_ptr<FILE> pfile(fopen("3.txt", "w"), [](FILE* fp){
if(fp){fclose(fp); fp = nullptr;} std::cout << "file auto closed.\n";});
}