Luna's blog 月亮月亮酱

weak_ptr的作用

2019-07-12
C++

解决悬空引用

异步处理时不能保证目标依然存在,可以使用weak_ptr检测

#include <iostream>
#include <memory>

int main()
{
	// OLD, problem with dangling pointer
	// PROBLEM: ref will point to undefined data!
	// NEW
	// SOLUTION: check expired() or lock() to determine if pointer is valid

	// empty definition
	std::shared_ptr<int> sptr;

	// takes ownership of pointer
	sptr.reset(new int);
	*sptr = 10;

	// get pointer to data without taking ownership
	std::weak_ptr<int> weak1 = sptr;

	// deletes managed object, acquires new pointer
	sptr.reset(new int);
	*sptr = 5;

	// get pointer to new data without taking ownership
	std::weak_ptr<int> weak2 = sptr;

	// weak1 is expired!
	if (auto tmp = weak1.lock())
		std::cout << *tmp << '\n';
	else
		std::cout << "weak1 is expired\n";

	// weak2 points to new data (5)
	if (auto tmp = weak2.lock())
		std::cout << *tmp << '\n';
	else
		std::cout << "weak2 is expired\n";
} 

代码中weak1指向的对象被析构了,虽然sptr仍然有效,但是weak1可以保留之前的对象的状态而不增加引用计数

解决循环引用

当必须两个对象相互引用时,可以使用weak_ptr


Similar Posts

Content