๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ๊ธฐ์ดˆ

[C/C++] 10. ํฌ์ธํ„ฐ(feat. ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ)

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 4. 26.

 

 

 

โœ… ํฌ์ธํ„ฐ

  C++์˜ ์žฅ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ๋‹จ์ ์œผ๋กœ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋ˆˆ์œผ๋กœ ํ›คํžˆ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž˜๋ชป ๊ด€๋ฆฌํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ™•์‹คํ•œ ๊ฑด C/C++์€ ์ปดํ“จํ„ฐ์˜ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ๊ธฐ์—๋Š” ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํฌ์ธํ„ฐ๋Š” ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋‹ค. 64๋น„ํŠธ ์ฒด์ œ์—์„œ integer ํƒ€์ž…์˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋Š” ๋ช‡์ธ๊ฐ€๋ฅผ ๋ฌป๋Š” ์งˆ๋ฌธ์— ๋งŽ์€ ๋ถ„๋“ค์ด 4byte๋ผ๊ณ  ๋Œ€๋‹ตํ•œ๋‹ค. ํฌ์ธํ„ฐ๋ณ€์ˆ˜๋Š” ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ๋ณ€์ˆ˜๋Š” ์ปดํ“จํ„ฐ์˜ ์›Œ๋“œ(word)์™€ ๊ฐ™๋‹ค. 8๋น„ํŠธ ์ฒด์ œ์—์„œ๋Š” 1 ์›Œ๋“œ๊ฐ€ 8๋น„ํŠธ=1๋ฐ”์ดํŠธ์ด๋‹ค. ๋”ฐ๋ผ์„œ 64๋น„ํŠธ ์ฒด์ œ์—์„œ๋Š” ํƒ€์ž…์ด ๋ฌด์—‡์ด๊ฑด ๊ฐ„์— ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋Š” 64๋น„ํŠธ=8๋ฐ”์ดํŠธ๋กœ ๊ณ ์ •์ด๋‹ค.(๋ฉ”๋ชจ๋ฆฌ๋ฅผ 2์˜ 64์Šน๊นŒ์ง€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป)

 

ํฌ์ธํ„ฐ์˜ ์‚ฌ์šฉ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

#include <iostream>

int main()
{
    int var = 3;
    int* p = &var;

    *p = 5;

    std::cout << "var: " << var << ", *p: " << *p << std::endl; 
    std::cout << "&var: " << &var << ", p: " << p << std::endl; 
}

// ์‹คํ–‰๊ฒฐ๊ณผ
// var: 5, *p = 5;
// &var: 0x90, p: 0x90(์‹คํ–‰ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

ํฌ์ธํ„ฐ์˜ ์„ ์–ธ ๋ฐฉ์‹์€ *์„ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฒƒ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. int* p ๋ผ๊ณ  ํ•˜๋Š” ์ˆœ๊ฐ„ p๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ด๋ฉฐ, ์ผ๋ฐ˜ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค. ์ฃผ์†Œ๊ฐ’์ด ๋‹ด๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋˜ํ•œ ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์—ฐ์‚ฐ์ž๋Š” &์ด๋‹ค. &var๋Š” var์˜ ์ฃผ์†Œ๊ฐ’์„ ๋œปํ•˜๊ณ , ๊ทธ ์ฃผ์†Œ๊ฐ’์„ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ p์— ๋„ฃ๋Š”๋‹ค. ๋˜ํ•œ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ์—ฐ์‚ฐ์ž๋Š” *์ด๋‹ค. *p๋Š” p๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์–ด๋ ค์›Œ ํ•œ๋‹ค. ๋”ฑ ํ•œ๋ฒˆ, ๊ฐœ๋…๋งŒ ํ™•์‹คํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ์‰ฝ๊ฒŒ ๋Š๊ปด์ง„๋‹ค. ๋‹ค๊ฐ€๊ฐ€์ง€ ๋ชปํ•  ๋•Œ์˜ ๋Š๊ผˆ๋˜ ํฐ ๋ฒฝ์€ ์–ด๋Š์ƒˆ ๋‚ด ๋ฐœ์•„๋ž˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‚˜๋Š” ํฌ์ธํ„ฐ ๊ฐœ๋…์ด ํ—ท๊ฐˆ๋ฆด ๋• ๋ฌด์กฐ๊ฑด ์œ„์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด๋ผ๊ณ  ์กฐ์–ธํ•œ๋‹ค. ๋ณ€์ˆ˜ p์˜ ๊ฐ’์—๋Š” var์˜ ์ฃผ์†Œ๊ฐ’ 0x90์ด ๋“ค์–ด๊ฐ€์žˆ์œผ๋ฉฐ p๋ฅผ ํ†ตํ•ด์„œ var์˜ ๊ฐ’(5)์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  *p๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์œ„์ฒ˜๋Ÿผ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๊ฐ„๋‹ค๋ฉด ์ด์ค‘, ์‚ผ์ค‘ ํฌ์ธํ„ฐ๋„ ์–ด๋ ต์ง€ ์•Š๋‹ค.(๋‹ค์ค‘ ํฌ์ธํ„ฐ๋Š” ์“ฐ์ž„์ด ๋งŽ์ง€ ์•Š์•„์„œ ์ œ์™ธ์‹œ์ผฐ๋‹ค)

 

 

โœ… ๋™์  ํ• ๋‹น

๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด PCB(ํ”„๋กœ์„ธ์Šค ์ œ์–ด๋ธ”๋ก)๊ณผ ํ•จ๊ป˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋“œ๋œ๋‹ค. ๋กœ๋“œ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๊ตฌ๋ถ„๋œ๋‹ค.

Code์˜์—ญ, Data์˜์—ญ, Heap์˜์—ญ, Stack์˜์—ญ 4๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. Data์˜์—ญ์—๋Š” ์„ ์–ธ๋œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋‚ด๋‚ด ์ƒ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค. Bss์˜์—ญ์€ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋œปํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” Data์˜์—ญ์— ์†ํ•œ๋‹ค๊ณ  ์šฐ์„  ์•Œ์•„๋‘์ž. ๊ทธ๋ฆฌ๊ณ  Code์˜์—ญ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง  ์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ดํ›„ Heap์˜์—ญ๊ณผ Stack์˜์—ญ์€ ์ „์—ญ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ณ€์ˆ˜๋“ค์ด ์œ„์น˜ํ•˜๋Š” ๋ฐ, ์—ฌ๊ธฐ์„œ Heap์˜์—ญ์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

 

  ์—ฌํƒœ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ์ง  ์ฝ”๋“œ๋“ค์€ ๋ชจ๋‘ Stack์˜์—ญ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ์–ธ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋“ค์€ ์ง€์—ญ ๋ณ€์ˆ˜๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Heap์—๋Š” ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐˆ๊นŒ? C++์—์„œ๋Š” ๋™์ ํ• ๋‹น ๊ตฌ๋ฌธ์ด ์žˆ๋Š”๋ฐ, ๋™์ ํ• ๋‹น๋œ ๋ณ€์ˆ˜์˜ ํŠน์ง•์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์†Œ๋ฉธํ•ด์ฃผ๊ธฐ ์ „๊นŒ์ง€๋Š” ์ ˆ๋Œ€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Stack์— ์œ„์น˜ํ•˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์ƒ์• ์ฃผ๊ธฐ์ธ ์Šค์ฝ”ํ”„{}๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์†Œ๋ฉธ๋œ๋‹ค. Stack์˜ ํŠน์ง•์€ ํ›„์ž…์„ ์ถœ(Last-in, first-out)์ธ๋ฐ, ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜๊ฐ„๋‹ค. ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์Šคํƒ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. Aํ•จ์ˆ˜์—์„œ Bํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Bํ•จ์ˆ˜์—์„œ Cํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ A->B->C์ˆœ์œผ๋กœ ์Œ“์ด์ง€๋งŒ ๋‹ค์‹œ ๋‚˜๊ฐˆ ๋• C->B->A์ˆœ์œผ๋กœ ๋‚˜๊ฐ„๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง€์—ญ๋ณ€์ˆ˜ ๋˜ํ•œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ถ€ํ„ฐ ์†Œ๋ฉธ๋˜์–ด ๊ฐ„๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜์–ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ Stack์˜์—ญ๊ณผ Heap์˜์—ญ์ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ์†Œ๋ฉธ์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋‘ ์˜์—ญ์ด ์„ธ๋ ฅ์„ ๊ฒจ๋ฃจ๋“ฏ ๋Š˜๊ธฐ๋„ ํ•˜๊ณ  ์ค„๊ธฐ๋„ ํ•œ๋‹ค.

 

  ํ•˜์ง€๋งŒ Heap์˜์—ญ์€ ์ €์ ˆ๋กœ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

#include <iostream>

void createHeapVar(int* p)
{
    p = new int(111);
}

int main()
{
    int* dynamicPtr1 = new int(5);
    *dynamicPtr = 8;

    int *var = nullptr;
    createHeapVar(var);

    std::cout << "*dynamicPtr: " << *dynamicPtr << std::endl;
    std::cout << "*var: " << *var << std::endl;

    //delete dynamicPtr;
    //delete var;
}

// ์‹คํ–‰๊ฒฐ๊ณผ
// *dynamicPtr: 8
// *var: 111

  new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋™์ ํ• ๋‹น์„ ํ•˜๋Š” ๋ชจ์Šต์ด๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” new <type>(์ดˆ๊ธฐํ™”๊ตฌ๋ฌธ) ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋™์ ํ• ๋‹น์€ ์™œ ์‚ฌ์šฉํ• ๊นŒ? ๋™์ ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋Ÿฐํƒ€์ž„์‹œ ๋‚ด๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‹ค์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋˜ ํ•„์š”ํ•  ๋•Œ ์†Œ๋ฉธ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์ด๋‹ค. ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ ํด๋ž˜์Šค์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ๋ฉค๋ฒ„๋ฅผ ํฌ์ธํ„ฐ๋กœ ๋‘๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ• ๋‹น์‹œํ‚ค๊ธฐ๋„ ํ•œ๋‹ค. ๋™์ ํ• ๋‹น์€ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๋ฉด์„œ ์ž์œ ๋„๊ฐ€ ํฐ ๋งŒํผ ์†Œ๋ฉธ์— ๋Œ€ํ•œ ์ฑ…์ž„๋„ ์ ธ์•ผ ํ•œ๋‹ค.

 

  19,20๋ฒˆ์งธ ์ค„ delete๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์—ญ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•  ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ new๋ฅผ ์ˆ˜์—†์ด ๋งŽ์ด ํ•˜๊ณ  delete๋ฅผ ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด ๋ณด์ž. Memory leak์ด ๋ฐœ์ƒ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ๊ธˆ๋ฐฉ ์‹คํ–‰๋˜๊ณ  main์ข…๋ฃŒ๋˜๋Š” ์‹ฌํ”Œํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์ด๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ํ”„๋กœ๊ทธ๋žจ์ธ ๊ฒฝ์šฐ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ ํ• ๋‹น์„ ์“ฐ๋Š” ๊ฒฝ์šฐ์—” ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‹ ๊ฒฝ ์จ์ค˜์•ผ ํ•œ๋‹ค.

 

 

๐Ÿงจ์ฃผ์˜

๋™์ ํ• ๋‹น์„ ์“ฐ๋Š” ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž๋„ ์‚ฌ๋žŒ์ด๊ณ  ๋ˆ„๊ตฌ๋‚˜ ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ํŠน์ • ํ•จ์ˆ˜์—์„œ ์กฐ๊ธฐ๋ฆฌํ„ด์„ ํ•  ๊ฒฝ์šฐ์ด๋‹ค. 

#include <iostream>
bool process(int var1, bool var2)
{
    UserObj user = new UserObj;	// ์ƒ์„ฑ์ž์— ๋„ฃ์„ ๋‚ด์šฉ ์—†์œผ๋ฉด ๊ด„ํ˜ธ ์ƒ๋žต ๊ฐ€๋Šฅ

    if (user.id < 0 || var1 < 0)
    {
        std::cout << "Invalid var1!" << std::endl; 
        return false;
    }

    if (!user.flag || !var2)
    {
        std::cout << "Invalid var2!" << std::endl; 
        return false;
    }


    ...


    delete user;
    return true;
}

 

๋™์ ํ• ๋‹น๋œ user์™€ ํ•จ๊ป˜ var1๊ณผ var2๋ฅผ ํ•จ์ˆ˜ ์ดˆ๊ธฐ์— ๊ฒ€์‚ฌํ•ด์„œ ์กฐ๊ธฐ ๋ฆฌํ„ดํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์กฐ๊ธฐ๋ฆฌํ„ด ๊ตฌ๋ฌธ์— delete๊ฐ€ ์—†์œผ๋ฏ€๋กœ Memory leak์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค. ์–ผํ• ๋ณด๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ด๋ฉฐ ํ•จ์ˆ˜ ์ข…๋ฃŒ ์ „์— delete ํ–ˆ๋‹ค๊ณ  ์•ˆ์‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

โœ… ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ

๊ธฐ์กด์˜ C++ ๊ฐœ๋ฐœ์ž์™€ ์ž…๋ฌธ์ž๋กœ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ ์†Œ๋ฉธ์— ๋Œ€ํ•œ ํ™˜๋ฉธ๊ณผ ๊ณ ์ถฉ์ด ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๋‹คํ–‰ํžˆ C++11๋ถ€ํ„ฐ๋Š” ์†Œ๋ฉธ์„ ์ž๋™์œผ๋กœ ์ฑ…์ž„์ ธ์ฃผ๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

#include <memory>

int main()
{
    std::unique_ptr<int> p1 = nullptr;
    p1.reset(new int(5));

    std::unique_ptr<int> p2 = std::make_unique<int>(5);
    int* p3 = p2.get();
}

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์ข…๋ฅ˜์—๋Š” unique_ptr, shared_ptr, weak_ptr ๋“ฑ์ด ์žˆ์ง€๋งŒ, ์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ๊ฐ€์žฅ ํ”ํžˆ ์“ฐ์ด๋Š” unique_ptr๋กœ ์„ค๋ช…ํ•˜๊ณ  ์ฃผํ›„์— ์ž์„ธํ•˜๊ฒŒ ํฌ์ŠคํŒ…ํ•˜๊ฒ ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด delete๊ตฌ๋ฌธ์ด ์—†๋‹ค. ์‹ค์ˆ˜๋กœ ์•ˆ์ ์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šค์ฝ”ํ”„{}๊ฐ€ ๋๋‚  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ delete๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœ๋œ๋‹ค.

  ๊ธฐ๋ณธ์ ์ธ unique_ptr์˜ ํ˜•ํƒœ๋Š” std::unique_ptr<ํƒ€์ž…> (๋ณ€์ˆ˜)์ด๋‹ค. ์ฒ˜์Œ์— nullptr๋กœ ์„ ์–ธํ–ˆ๋‹ค๊ฐ€ reset๊ตฌ๋ฌธ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ , ์• ์ดˆ์— ์„ ์–ธ ์‹œ make_unique๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ๋” ์„ ํ˜ธํ•˜๋ฉฐ, ๊ณต์‹๋ฌธ์„œ์—๋„ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœํ•œ๋‹ค. unique_ptr ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ Primative ํฌ์ธํ„ฐ๋ฅผ ์–ป๊ณ  ์‹ถ์œผ๋ฉด get() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

์Šค๋งˆํŠธ ํฌ์ธํ„ฐ ๋•๋ถ„์— ๋ฉ”๋ชจ๋ฆฌ๊ด€๋ฆฌ๋กœ๋ถ€ํ„ฐ ์กฐ๊ธˆ ์•ˆ์ „ํ•ด์กŒ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ชจ๋˜ C++์€ ์ง€๊ธˆ๋„ ์ƒˆ๋กœ์šด ๊ฐœ๋…๊ณผ ํŽธ์˜์„ฑ์„ ํ™•์žฅ์‹œํ‚ค๊ณ  ์žˆ์œผ๋ฉฐ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒƒ์˜ ํ™œ์šฉ์€ ๋ฐฐ์šฐ๊ณ , ์ƒˆ๋กœ์šด ๊ฒƒ์˜ ๋‚ด๋ถ€ ์›๋ฆฌ๋ฅผ ์ ๋‹นํžˆ ํŒŒ์•…ํ•จ์œผ๋กœ์จ ๊ธฐ๋ณธ๊ธฐ๊ฐ€ ์ถœ์ค‘ํ•˜๋ฉด์„œ ๋™์‹œ์— ํŠธ๋ Œ๋””ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋ณด์ž.

๋Œ“๊ธ€