std::shared_ptr 및 std::weakptr 인용 계수의 순환 인용 문제
3741 단어 기타
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 방법을 실현하여 관리하는 자원이 방출되었는지 여부를 판단합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Github 프로필 Badge로 꾸미기앞으로 열심히 할 예정이니 많은 관심 부탁드립니다 😍😍 나의 머리로는 이해할 수 없는 코드들을 보며 머리가 꺠지려 할 때에, 학교 친구들의 github가 눈에 들어왔습니다. 인터넷에 나온 거로 많이 해 봤고 탬플릿도...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.