โ ํฌ์ธํฐ
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++์ ์ง๊ธ๋ ์๋ก์ด ๊ฐ๋ ๊ณผ ํธ์์ฑ์ ํ์ฅ์ํค๊ณ ์์ผ๋ฉฐ ๋ฐ์ ํ๊ณ ์๋ค. ์๋ก์ด ๊ฒ์ ํ์ฉ์ ๋ฐฐ์ฐ๊ณ , ์๋ก์ด ๊ฒ์ ๋ด๋ถ ์๋ฆฌ๋ฅผ ์ ๋นํ ํ์ ํจ์ผ๋ก์จ ๊ธฐ๋ณธ๊ธฐ๊ฐ ์ถ์คํ๋ฉด์ ๋์์ ํธ๋ ๋ํ ๊ฐ๋ฐ์๊ฐ ๋๋ณด์.
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > C++ ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] 12. ๋ฌธ์์ด(feat. ์ง๋ ฌํ) (0) | 2023.05.06 |
---|---|
[C++] 11. ํจ์(feat. ์ ์ญํจ์, ๋ฉค๋ฒํจ์, ์ ์ ํจ์, ๋๋คํจ์) (0) | 2023.04.28 |
[C/C++] 9. ๋ฐฐ์ด(feat. vector & array) (0) | 2023.04.25 |
[C/C++] 8. ๋ฐ๋ณต๋ฌธ(์ฌํ)(feat. iterator, predicate, lambda) (0) | 2023.04.22 |
[C/C++] 7. ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ฑ(windows/linux) (1) | 2023.04.11 |
๋๊ธ