(Cโบโบ) ๐คWeak Pointer
๋๋๋ฌด๋ฅ ํ ๋
์ํธ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ์๋ 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()
ํจ์๋ ๊ฐ์ฒด์ ์ ํจ์ฑ ๊ฒ์ฌ๊น์ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์ด๊ฒ์ ์ด์ฉํ๋ฉด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. ๊ทผ๋ฐ ๋ญ๊ฐ ๊ทธ๋ฅ ํฌ์ธํฐ๋ฅผ ์ฐ๋๊ฑฐ๋งํผ ๊ท์ฐฎ์ ์ผ์ด ๋์ด๋ฒ๋ฆฐ ๋๋์ด๋ค. ํ์ง๋ง ์๋๋ก์ด๋์ ๋ฐฉ๋ํ ์ฝ๋๊ฐ ๋ชจ๋ ์ด๊ฒ๋ค์ ์ฌ์ฉํ๊ณ ์์ผ๋ ๋ถ์์ด๋ ์ฌ์ฉ, ์์ ์ ์ํด์๋ ๋ฐ๋์ ์์๋ ํ์๊ฐ ์๋ค.