1.删除器是lambda表达式,将匿名函数具名,也可直接使用匿名函数
auto deleter = [](AVPacket* p_packet){av_packet_free(&p_packet);};
std::unique_ptr<AVPacket, decltype(deleter)> up_packet((AVPacket*)
//或是shared_ptr
std::shared_ptr<AVPacket> up_packet((AVPacket*)av_malloc(sizeof(AVPacket)), deleter);
//或是匿名的lambda
std::shared_ptr<AVPacket> up_packet((AVPacket*)av_malloc(sizeof(AVPacket)), [](AVPacket* p_packet){av_packet_free(&p_packet);});
2.用std::make_shared<>()或std::make_unique<>
不得行,莫得这种操作,可以用上面那种然后
= std::move();
3.其他方式的自定义删除器
//数组放在堆中
std::shared_ptr<Sample> p(new Sample[5], std::default_delete<Sample[]>());
//仿函数方式
class Deleter
{
public:
void operator() (Sample *x) {
std::cout << "Deleter function called" << std::endl;
delete[] x;
}
};
// 构造函数传递自定义删除器指针
std::shared_ptr<Sample> p2(new Sample[5], Deleter);
//使用std::function
void Deleter(Connection *connection){
close(connection);
delete connection;
}
int main(){
std::function<void (Connection*)> deleter(Deleter);
// 新建管理连接Connection的智能指针
shared_ptr<Connection> sp(new Connection("shared_ptr"), deleter);
unique_ptr<Connection, decltype(deleter)> up(new Connection("unique_ptr"), deleter);
}