(Cโบโบ) ๐Ÿค•Weak Pointer

๋Œ€๋‚˜๋ฌด๋ฅ˜ ํ…Œ๋ž€

1 minute read

์ƒํ˜ธ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋˜ strong pointer์˜ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์—์„œ ๋ฉค๋ฒ„์˜ sp๊ธ€์ž๋ฅผ wp๋กœ๋งŒ ๋ฐ”๊ฟ”๋ณด๋ฉด,

using namespace android;  
  
class AAA;  
class BBB;  
  
class AAA : public RefBase  
{  
	public:  
		wp<BBB> pb;  
		AAA(){ printf("AAA::AAA()\n"); }  
		~AAA(){ printf("AAA::~AAA()\n"); }  
		void foo(){ printf("AAA::foo()\n"); }  
};  
  
class BBB : public RefBase  
{  
	public:  
		wp<AAA> pa;  
		BBB(){ printf("BBB::BBB()\n"); }  
		~BBB(){ printf("BBB::~BBB()\n"); }  
		void foo(){ printf("AAA::foo()\n"); }  
};  
  
int main()  
{  
	{  
		sp<AAA> p1 = new AAA();  
		sp<BBB> p2 = new BBB();  
		p1->pb = p2;  
		p2->pa = p1;  
	}  
	printf("step 1.\n");  
  
	return 0;  
}  

์ƒํ˜ธ์ฐธ์กฐ๋ฅผ ํ–ˆ์Œ์—๋„ ์†Œ๋ฉธ์ž๊ฐ€ ์ž˜๋ถˆ๋ฆฌ๋ฉฐ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œํ•ด๊ฒฐ??
๋‚ด์šฉ์„ ์ข€ ๋” ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

์šฐ์„  wp๊ฐ€ ๋ฐ”๋กœ weak pointer์ด๋‹ค. ๋ญ”๊ฐ€ ์ด๋ฆ„๋งŒ ๋ด๋„ Strong pointer์™€ ๋Œ€๋น„๋˜๋Š” ๋А๋‚Œ์ด๋‹ค.

int main()  
{  
	{  
		wp<AAA> p1 = new AAA();  
		p1->foo();       // Compile error!  
	}  
	printf("step 1.\n");  
  
	return 0;  
}  

wp๋Š” ->์—ฐ์‚ฐ์ž๊ฐ€ ์˜ค๋ฒ„๋กœ๋”ฉ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

???
ํฌ์ธํ„ฐ๋ผ๋ฉด์„œโ€ฆ์ด..๋ฌด์Šจ..???

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ฆฌ๊ณ !
wp๋Š” ์Šค์ฝ”ํ”„์—์„œ ๋ฒ—์–ด๋‚˜์„œ ์‚ฌ๋ผ์ง€๋”๋ผ๋„ ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š”๋‹คโ€ฆ

???
์Šค๋งˆํŠธํฌ์ธํ„ฐ๋ผ๋ฉด์„œโ€ฆ

๊ทธ๋ž˜์„œ wp๋Š” ์ •๋ง๋กœ ์ƒํ˜ธ์ฐธ์กฐ ๋ฌธ์ œ๋งŒ์„ ์œ„ํ•ด์„œ ๋‚˜์˜จ๊ฑฐ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” sp๋กœ ๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋•Œ๋Š” promote()๋ผ๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ํ•„์š”ํ•˜๋‹ค.

int main() {  
	{  
		wp<AAA> p1 = new AAA;  
		sp<AAA> p2 = p1.promote();  
		p2->foo();     // OK  
	}  
	printf("step 1.\n");  
  
	return 0;  
}  

์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ์ž˜ ํ˜ธ์ถœ๋œ๋‹ค. ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ sp์—์„œ wp๋กœ ๋ณ€ํ™˜ํ• ๋•Œ๋Š” ๋ณ„๋„์˜ ํ•จ์ˆ˜ํ˜ธ์ถœ์—†์ด ๋ฐ”๋กœ ๋Œ€์ž…ํ•˜๋ฉด ๋œ๋‹ค๋Š” ์ ๋„ ๊ธฐ์–ตํ•œ๋‹ค.

#include <stdio.h>  
#include "StrongPointer.h"  
#include "RefBase.h"  
  
using namespace android;  
  
class AAA : public RefBase  
{  
	int data;  
	public:  
		AAA(){ printf("AAA::AAA()\n"); }  
		~AAA(){ printf("AAA::~AAA()\n"); }  
		void foo()  
		{   
			printf("AAA::foo()\n");   
			//data = 20;  
		}  
};  
  
int main()  
{  
	{  
		wp<AAA> p1 = new AAA;  
		{  
			sp<AAA> p2 = p1.promote();  
		} // ~AAA() ์†Œ๋ฉธ๋จ  
		printf("step 1.\n");  
		p1.promote()->foo(); // AAA::foo(this);  
	}  
	printf("step 2.\n");  
  
	return 0;  
}  

์ข€ ์ž‘์œ„์ ์ด์ง€๋งŒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ์ด๋‹ค. brace๋ฅผ ๋‚˜๊ฐ€๋ฉด์„œ sp๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜์—ˆ์œผ๋‚˜ ๋ฐ–์˜ wp๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์˜ˆ์ œ์ด๋‹ค. ์ด๊ฑด ๋ฐฑํผ ํฌ๋ž˜์‹œ๋‹ค.

int main()  
{  
	{  
		wp<AAA> p1 = new AAA;  
		{  
			sp<AAA> p2 = p1.promote();  
		} // ~AAA()  
		printf("step 1.\n");  
		if( p1.promote() == 0 )  
			printf("์ด๋ฏธ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋จ\n");  
		else  
			p1.promote()->foo(); // AAA::foo(this);  
	}  
	printf("step 2.\n");  
  
	return 0;  
}  

๋‹ค๋งŒ promote() ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๊ฒƒ์„ ์ด์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทผ๋ฐ ๋ญ”๊ฐ€ ๊ทธ๋ƒฅ ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๋Š”๊ฑฐ๋งŒํผ ๊ท€์ฐฎ์€ ์ผ์ด ๋˜์–ด๋ฒ„๋ฆฐ ๋А๋‚Œ์ด๋‹ค. ํ•˜์ง€๋งŒ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ๋ถ„์„์ด๋‚˜ ์‚ฌ์šฉ, ์ˆ˜์ •์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.