์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
C++/๋ฌธ๋ฒ•

C++ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ํฌ์ธํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜์ž (smart_pointer)

  • -
๋ฐ˜์‘ํ˜•

๐Ÿ‘‰ ํฌ์ŠคํŒ… ๋‚ด์šฉ

  • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

 

๐Ÿ‘‰ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ์‚ฌ์šฉ์ด์œ 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… ์ฝ”๋“œ

#include <iostream>

class MyClass
{
public :
	int a;
};

int main()
{
	MyClass* mClass = new MyClass();
	

	return 0;
}

 

ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฑด ์—†์–ด๋ณด์ด์ง€๋งŒ ์ด ์ฝ”๋“œ์—๋Š” ํฐ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ”๋กœ mClass ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•ด RAII ๋””์ž์ธ ํŒจํ„ด์ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘‰ RAII ๋””์ž์ธ ํŒจํ„ด

โœ… ์ฝ”๋“œ

#include <iostream>

template<typename T>
class RAII
{
public:
	RAII() { _inst = new T(); }
	~RAII() { delete _inst; }

private:
	T* _inst;
};

class MyClass
{
public :
	MyClass() { std::cout << "์ƒ์„ฑ์ž ํ˜ธ์ถœ" << std::endl; }
	~MyClass() { std::cout << "์†Œ๋ฉธ์ž ํ˜ธ์ถœ" << std::endl; }
public :
	int a;
};

int main()
{
	RAII<MyClass> mClass{};

	return 0;
}

 

โœ… ์‹คํ–‰ ๊ฒฐ๊ณผ

// ์ƒ์„ฑ์ž ํ˜ธ์ถœ
// ์†Œ๋ฉธ์ž ํ˜ธ์ถœ

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ƒˆ๋กœ์šด RAII ํŒจํ„ด์„ ์ด์šฉํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ํฌ์ธํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ unique_ptr

๋จผ์ € unique_ptr์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๋Š” ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ํฌ์ธํ„ฐ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉฐ ๊ณต์œ ์‹œ์—๋Š” ์ž์‹ ์˜ ์†Œ์œ ๊ถŒ์„ ํฌ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘‰ ์‚ฌ์šฉ๋ฒ•(unique_ptr)

#include <iostream>


class MyClass
{
public :
	MyClass() { std::cout << "์ƒ์„ฑ์ž ํ˜ธ์ถœ" << std::endl; }
	~MyClass() { std::cout << "์†Œ๋ฉธ์ž ํ˜ธ์ถœ" << std::endl; }
public :
	int a;
};

int main()
{
	std::unique_ptr<MyClass> myCalss = std::make_unique<MyClass>();
	return 0;
}

  

๐Ÿ‘‰ ์ฃผ์˜์‚ฌํ•ญ(unique_ptr)

โœ… ์ฝ”๋“œ

#include <iostream>


class MyClass
{
public :
	MyClass() { std::cout << "์ƒ์„ฑ์ž ํ˜ธ์ถœ" << std::endl; }
	~MyClass() { std::cout << "์†Œ๋ฉธ์ž ํ˜ธ์ถœ" << std::endl; }
public :
	int a;
};

int main()
{
	MyClass* mClass = new MyClass();

	std::unique_ptr<MyClass> myCalss  { mClass };
	std::unique_ptr<MyClass> myCalss2 { mClass };

	myCalss2.reset();

	return 0;
}

 

์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ™์ธ ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ฐœ์˜ unique_ptr๋กœ ๊ด€๋ฆฌ ์‹œ ํ•˜๋‚˜์—์„œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๋ฉด 2๋ฒˆ์˜ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

โœ… ์‹คํ–‰๊ฒฐ๊ณผ

// ์ƒ์„ฑ์ž ํ˜ธ์ถœ
// ์†Œ๋ฉธ์ž ํ˜ธ์ถœ
// ์†Œ๋ฉธ์ž ํ˜ธ์ถœ

 

๊ทธ๋ ‡๊ธฐ์— ์†Œ์œ ๊ถŒ์„ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

โœ… ์ฝ”๋“œ

std::unique_ptr<MyClass> myCalss  { mClass };
std::unique_ptr<MyClass> myCalss2 { myCalss.release() };

 

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ์†Œ์œ ๊ถŒ์„ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ shared_ptr

shared_ptr์˜ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… ์ฝ”๋“œ

std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>();
std::shared_ptr<MyClass> ptr2 = ptr;

 

์ด๋Ÿฐ์‹์œผ๋กœ 2๊ฐœ์˜ shared_ptr์ด ํ•˜๋‚˜์˜ ํฌ์ธํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๋ถ€์ ์œผ๋กœ reference counting์„ ํ†ตํ•˜์—ฌ ํ˜„์žฌ ๋ช‡ ๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ํฌ์ธํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋กœ ์ธํ•ด์„œ ํ•˜๋‚˜์”ฉ reset์„ ํ•  ๋•Œ, ๋ฐ”๋กœ ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ ๋˜๋Š”๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
reference count๊ฐ€ 1์”ฉ ์ค„์–ด๋“ค๊ณ  0์ด๋˜๋ฉด ๋น„๋กœ์„œ ํ•ด์ œ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ์ƒ์„ฑ ํ•จ์ˆ˜

  • unique_ptr์˜ ๊ฒฝ์šฐ make_unique<type>() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•˜๋‚˜ ์ด๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋ฉ๋‹ˆ๋‹ค.
  • make_unique๊ฐ€ ์•„๋‹Œ make_unique_for_overwirte<type>() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ์‹œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (C++20)
  • shared_ptr์˜ ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๊ฒŒ make_shared<type>() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ์‹œ ๊ธฐ๋ณธ๊ฐ’ ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ๋™์ผํ•˜๊ฒŒ make_shared_for_overwirte<type>() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค                  (C++20)
๋ฐ˜์‘ํ˜•

'C++ > ๋ฌธ๋ฒ•' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

C++ malloc๊ณผ new์˜ ์ฐจ์ด  (0) 2024.02.17
C++ string_view  (0) 2024.02.16
C++ ๊ตฌ์กฐ์  ๋ฐ”์ธ๋”ฉ(Structured Bindings)  (0) 2024.02.15
C++ ์ƒ์ˆ˜ ์ง€์ • (const, constexpr, consteval)  (0) 2024.02.14
C++ Initializer_list  (0) 2024.02.14
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.