C++智能指针的坑,你了解吗

127 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

智能指针作为C++11中的重磅内容,是值得称道的,也是广为被面试官提问的。 虽然在C++11之前就有auto_ptr,但是由于其自身存在的问题,未得到广泛推广,经过C++11后的完善,智能指针完善后才得以推广,避免了应用裸指针而导致的内存泄露和野指针的问题。但是智能指针的坑你了解吗

智能指针

  1. 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); //失败,类型不匹配
  1. 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);
  1. std::weak_ptr:作为std::shared_ptr的配套指针,常用于解决相互持有的情况,通过std::weak_ptr的lock函数可以获得相应的shared_ptr指针。