开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
智能指针作为C++11中的重磅内容,是值得称道的,也是广为被面试官提问的。 虽然在C++11之前就有auto_ptr,但是由于其自身存在的问题,未得到广泛推广,经过C++11后的完善,智能指针完善后才得以推广,避免了应用裸指针而导致的内存泄露和野指针的问题。但是智能指针的坑你了解吗
智能指针
- std::unique_ptr:独占类型的智能指针,其无拷贝构造函数、赋值运算符,注意,自定义析构器作为std::unique_ptr的一部分,声明其类型时注意自定义析构器的类型。
auto lambda_first = [](Printer* p) {
std::cout << "log first ....";
delete p;
};
auto lambda_sec = [](Printer* p) {
std::cout << "log second ....";
delete p;
};
auto firp = std::unique_ptr<Printer,decltype(lambda_first)>(new Printer("first"), lambda_first
);
auto secp = std::unique_ptr<Printer,decltype(lambda_sec)>(new Printer("second")
);
std::list<std::unique_ptr<Printer>> printer_list;
//printer_list.push_back(firp);//失败,类型不匹配
//printer_list.push_back(secp); //失败,类型不匹配
- std::shared_ptr:通过引用技术实现指针共享,当引用计数为零时,释放申请的内存。注意,shared_ptr的自定义析构器并不是共享指针的一部分,声明时不必理会自定义析构器的类型,同时,可以存储到相同的容器内。std::unique_ptr可以方便的转换为shared_ptr,但反向不能。
auto firp = std::shared_ptr<Printer>(new Printer("first"), [](Printer* p) {
std::cout << "log first ....";
delete p;
}
);
auto secp = std::shared_ptr<Printer>(new Printer("second"), [](Printer* p) {
std::cout << "log second ....";
delete p;
}
);
std::list<std::shared_ptr<Printer>> printer_list;
printer_list.push_back(firp);
printer_list.push_back(secp);
- std::weak_ptr:作为std::shared_ptr的配套指针,常用于解决相互持有的情况,通过std::weak_ptr的lock函数可以获得相应的shared_ptr指针。