std::shared_ptr 및 std::weakptr 인용 계수의 순환 인용 문제

3741 단어 기타
shared는 control Block을 가리키는 바늘을 유지합니다. control Block 내부에는 스마트 바늘 대상의 인용 개수가 포함되어 있습니다.
weak_ptr는 대상의 생명주기를 제어하지 않는 스마트 지침으로shared 를 가리킨다ptr 관리 대상입니다.이 대상의 메모리 관리를 하는 것은 강력한 인용의sharedptr. weak_ptr는 관리 대상에 대한 접근 수단만 제공합니다. 
  weak_ptr 디자인의 목적은sharedptr에 도입된 스마트 지침으로sharedptr 작업, 한 개만sharedptr 또는 다른 weakptr 대상 구조, 그 구조와 분석은 인용 기수의 증가나 감소를 일으키지 않는다.memory 파일에 정의됨(비memory.h), 이름 공간은 std.
  weak_ptr 사용:
std::shared_ptr sp(new int(10));std::weak_ptr wp(sp);wp = sp;printf("%d", wp.use_count());//1wp.reset();printf("%d", wp);//0//검사 weakptr 내부 대상의 합법성.if (std::shared_ptr sp = wp.lock()){}
 

구성원 함수


weak_ptr는 * 및 ->를 다시 불러오지 않았지만 lock을 사용하여 사용할 수 있는sharedptr 객체.주의,weakptr는 사용하기 전에 합법성을 검사해야 합니다.
expired는 관리된 대상이 풀렸는지 검사하는 데 사용되며 풀렸으면true로 되돌아갑니다.그렇지 않으면 false를 반환합니다.lock은 관리되는 객체에 대한 강력한 참조(shared ptr)를 가져오는 데 사용됩니다.expired가true라면 빈 sharedptr; 그렇지 않으면 sharedptr, 내부 대상 지향과 weakptr가 같습니다.use_count 반환과sharedptr가 공유하는 대상의 인용 계수입니다.reset가 weakptr를 비웁니다.weak_ptr는 복사나 할당을 지원하지만 해당하는shared 에 영향을 주지 않습니다ptr 내부 대상의 계수입니다.
 
위크를 어떻게 판단하는지ptr의 대상이 효력을 상실합니까?
사용해야 할 함수는 lock () 입니다. lock은shared 포인터를 되돌려 이 포인터가 비어 있는지 판단합니다.use_count ()도shared에서 인용한 개수를 얻을 수 있지만 속도가 느립니다.

weak 사용ptr해결sharedptr가 순환으로 인해 자원을 방출할 수 없는 문제가 발생했습니다


shared 사용ptr시, sharedptr는 강력한 인용입니다. 순환 인용이 존재하면 메모리 유출을 초래할 수 있습니다.위크ptr는 약한 인용으로 이 문제를 피할 수 있다. 그 원리: 약한 인용은 인용의 대상이 살아 있을 때 약한 인용이 반드시 존재하지 않는다는 것을 말한다.단지 존재할 때의 인용일 뿐이다. 약한 인용은 대상의 인용 계수를 수정하지 않는다. 이것은 약한 인용이 대상의 메모리를 관리하지 않는다는 것을 의미한다.  weak_ptr는 기능상 일반 지침과 유사하지만, 비교적 큰 차이점은 약한 인용은 관리된 대상이 방출되었는지 확인하고 불법 메모리에 접근하지 않도록 하는 것이다.
주의: 약한 인용 지침을 통해 순환 인용을 효과적으로 해제할 수 있지만 이런 방식은 반드시 프로그래머가 순환 인용이 발생할 것을 예견할 수 있는 상황에서만 사용할 수 있다. 이것은 단지 컴파일러의 해결 방안일 뿐이다. 만약에 프로그램이 실행 과정에서 순환 인용이 발생하면 메모리 유출을 초래할 수 있다.
#include 
#include 
 
class Woman;
class Man{
private:
	std::weak_ptr _wife;
	//std::shared_ptr _wife;
public:
	void setWife(std::shared_ptr woman){
		_wife = woman;
	}
 
	void doSomthing(){
		if(_wife.lock()){
		}
	}
 
	~Man(){
		std::cout << "kill man
"; } }; class Woman{ private: //std::weak_ptr _husband; std::shared_ptr _husband; public: void setHusband(std::shared_ptr man){ _husband = man; } ~Woman(){ std::cout < m(new Man()); std::shared_ptr w(new Woman()); if(m && w) { m->setWife(w); w->setHusband(m); } return 0; }

만류 내부에서 하나의 Woman을 인용하고, Woman류 내부에서도 하나의 만류를 인용한다.한 남자와 한 남자가 부부일 때 그들은 직접적으로 상호 인용 문제가 존재한다.man 내부에 와이프 생명기 관리를 위한 sharedptr 변수, 즉 와이프는 반드시 husband가 죽은 후에야 죽을 수 있다는 것이다.마찬가지로woman 내부에도husband의 생명기를 관리하는sharedptr 변수, 즉 husband는 와이프가 죽은 후에야 죽을 수 있다.이것이 바로 순환 인용에 존재하는 문제점이다. husband의 생명기는 와이프의 생명기에 의해 결정되고 와이프의 생명기는 husband의 생명기에 의해 결정된다. 마지막에 두 사람은 모두 죽지 못하고 자연 규칙을 위반하여 메모리 유출을 초래했다.
해결std::sharedptr 순환 인용 문제의 열쇠는weakptr손에.weak_ptr 대상이 자원을 인용할 때 인용 계수를 증가하지 않지만, lock () 방법으로 관리하는 자원이 방출되었는지 판단할 수 있습니다.그리고 자연스러운 질문은:weakptr는 자원의 인용 계수를 증가하지 않습니다.weakptr 대상이 되었을 때 자원이 갑자기 방출되면 어떻게 합니까?허허, 답은 네가 직접 weak을 통과할 수 없다는 것이다ptr에서 자원에 접근합니다.그럼 어떻게 weak 을 통과하는지...ptr에서 자원에 간접적으로 접근하시겠습니까?답은: 자원에 접근해야 할 때weakptr가 당신을 위해shared 생성ptr,shared_ptr는sharedptr가 풀리기 전에 관리하는 자원은 풀리지 않습니다.shared 만들기ptr 방법은 lock () 방법입니다.
세부:sharedptr는operator bool () const 방법을 실현하여 관리하는 자원이 방출되었는지 여부를 판단합니다.

좋은 웹페이지 즐겨찾기