[C++] RAII(SBRM)λ‘ μμ νκ² λ¦¬μμ€ κ΄λ¦¬νκΈ°
RAII(Resource Acquisition Is Initialization) - SBRM(Scope Bound Resource Managemnet)
κ°λΉμ§ 컬λ ν°(Garbage Collector)
κ° μλ C#κ³Ό λ¬λ¦¬, C++ νλ‘κ·Έλλ°μμ μμμ κ΄λ¦¬λ μ μ μΌλ‘ κ°λ°μμ μ±
μμ
λλ€. ν(Heap) μμμμ μ΄λ€ νΈλ€μ μμ±νμΌλ©΄ λ°λμ ν΄μ νμ¬ λ©λͺ¨λ¦¬ μ¬μ©μ λ°νν΄μΌ νλ κ²μ΄μ£ . λ§μ½, κ·Έλ μ§ μλ€λ©΄ λ©λͺ¨λ¦¬ λμκ° λ°μνκ±°λ μμΈ‘ λΆκ°λ₯ν μν©μ μ§λ©΄ν μ μμ΅λλ€.
μ¬κΈ°μ μμ(Resource)
μ΄λΌλ κ²μ νν μκΈ°νλ μ¬μ©μ λ²νΌ 곡κ°μ΄ λ μλ μκ³ , μμΌ, νμΌ, GDI λ± μ΄λ€ κ°μ²΄μ νΈλ€μ΄ λ μλ μμ΅λλ€. μ΄λ¬ν μμμ μμ±νκ³ , μ€μ½ν μμ(Scope bound)μ λ²μ΄λλ©΄ μλμΌλ‘ ν΄μ νλ κ°λ
μ RAII
λΌκ³ ν©λλ€. RAIIλ₯Ό λμμΈ ν¨ν΄(Design pattern) λλ κ΄μ©κ΅¬(Idiom)λΌκ³ λ νμ£ .
μ°Έκ³ λ‘, RAII μ΄λ¦μ΄ κ°λ
μ λΉν΄ μ μ νμ§ μλ€λ μκ²¬μ΄ μμ΅λλ€. RAII κ°λ
μ ν΅μ¬μ νκ΄΄(ν΄μ )μΈλ°, μ΄λ¦μ μ΄κΈ°νμ΄κΈ° λλ¬Έμ
λλ€. κ·Έλμ SBRM(Scope Bound Resource Management)
λΌλ μ΄λ¦μ΄ μκΈ΄ κ²μ΄μ£ . SBRMμ μλ―Έ κ·Έλλ‘, μ€μ½ν μμμμμ μμ κ΄λ¦¬λ₯Ό λ»ν©λλ€. μ’ λ μ΄ν΄νκΈ°κ° μ½μ£ ?
μλ λ§ν¬λ RAII μ΄λ¦μ λν λ²μκ° λ₯κ΄λμ ν΄μμΈλ°, ν΄λΉ λ§ν¬λ μ½μ΄λ³΄λ©΄ μ’μ κ² κ°μ΅λλ€.
RAIIκ° νμν μν©
κ·Έλ λ€λ©΄, RAIIλΌλ κ²μ΄ μ΄λ€ μν©μμ νμν κ²μΌκΉμ? λͺ κ°μ§ μμλ₯Ό λ€μ΄ λ³΄κ² μ΅λλ€.
mutexκ° μμ νκ² ν΄μ λμ§ μλ κ²½μ°
μλ μ½λλ doSomething()
ν¨μμ μ§μ
νλ©΄ mutex
λ‘ lockμ΄ κ±Έλ € λ€λ₯Έ 리μμ€μ μ κ·Όμ λ§κ² λκ³ , μ΄ν μμΈκ° λ°μνμ¬ κ°μ₯ κ·Όμ ν try-catch λ¬Έ
μΌλ‘ λΉ μ Έλκ°λ λμμ μνν©λλ€.
#include <mutex>
std::mutex mutex;
void doSomething()
{
mutex.lock();
throw std::exception("μμΈ λ°μ!");
mutex.unlock();
}
int main()
{
try
{
doSomething();
}
catch (const std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
}
μ¦, unlockμ΄ νΈμΆλμ§ μμ μ± λΆμμ νκ² ν¨μλ₯Ό λΉ μ Έλκ°λ μν©μ λλ€. μ΄λ κ² μ κΈμ΄ ν΄μ λμ§ μμ μ± νλ‘κ·Έλ¨μ΄ μ’ λ£λκ±°λ, λ€λ₯Έ κ³³μμ λ€μ lockμ νΈμΆνλ©΄ μ€λ₯κ° λ°μν©λλ€.
μ΄ κ²½μ°μλ lock_guard
λ₯Ό μ¬μ©νμ¬ μμ νκ² mutexλ₯Ό μ¬μ©ν μ μμ΅λλ€.
#include <mutex>
std::mutex mutex;
void doSomething()
{
std::lock_guard<std::mutex> g(mutex);
throw std::exception("μμΈ λ°μ!");
}
int main()
{
try
{
doSomething();
}
catch (const std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
}
lock_guard
λ RAII μ€νμΌ λ©μ»€λμ¦μ΄ μ μ©λ νΈλ¦¬ν mutex wrapper ν΄λμ€λ‘, lock_guard κ°μ²΄κ° μμ±λλ©΄ mutex μμ κΆμ μ»μΌλ €κ³ μλνκ³ , μ€μ½ν μμμ λ²μ΄λλ©΄ κ°μ²΄κ° νκ΄΄λκ³ ν΄μ λ©λλ€. μμΈν μ€λͺ
μ μλ λ§ν¬λ₯Ό μ°Έκ³ νμΈμ.
https://en.cppreference.com/w/cpp/thread/lock_guard
μ¬μ©μ λ©λͺ¨λ¦¬κ° μμ νκ² ν΄μ λμ§ μλ κ²½μ°
μ¬μ©μ λ©λͺ¨λ¦¬λ₯Ό μμ±νκ³ μ κ±°νκΈ° μν΄ new
μ delete
λ₯Ό μ¬μ©ν©λλ€. μλ μμλ, μ¬μ©μ λ©λͺ¨λ¦¬λ₯Ό μμ±νλλ° μ΄λ ν μ΄μ λ‘ deleteλ₯Ό μ μμ μΌλ‘ νΈμΆνμ§ μμ λ©λͺ¨λ¦¬ λμκ° κ°μ§λλ μν©μ
λλ€.
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
void doSomething()
{
unsigned char* buffer = new unsigned char[100];
throw std::exception("μμΈ λ°μ!");
delete buffer;
buffer = nullptr;
}
int main()
{
try
{
doSomething();
}
catch (const std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
_CrtDumpMemoryLeaks();
}
μ μ½λλ₯Ό μ€ννλ©΄ μλμ κ°μ΄ λ©λͺ¨λ¦¬ λμκ° κ°μ§λ©λλ€. ν΄λΉ λ©μμ§λ₯Ό λλΈ ν΄λ¦νλ©΄ μ νν 11λ²μ§Έ λΌμΈμμ λ©λͺ¨λ¦¬ λμκ° μμμ μ μ μμ΅λλ€.
μ μμμ CRTDBGλ₯Ό μ¬μ©νλ λ°©λ²μ μλ λ§ν¬λ₯Ό μ°Έκ³ νμΈμ.
[λλ²κΉ ] λ©λͺ¨λ¦¬ λμλ₯Ό μ κ²νλ λ°©λ² - CRTDBG (μμ ν¬ν¨)
μ΄λ κ² μ¬μ©μ λ©λͺ¨λ¦¬λ₯Ό μμ νκ² μ¬μ©νκΈ° μν΄μλ μ€λ§νΈ ν¬μΈν°(Smart pointer)
λ₯Ό μ¬μ©ν κ²μ κΆμ₯ν©λλ€.
#include <vector>
#include <memory>
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
void doSomething()
{
std::unique_ptr<std::vector<unsigned char>> buffer = std::make_unique<std::vector<unsigned char>>(100);
throw std::exception("μμΈ λ°μ!");
}
int main()
{
try
{
doSomething();
}
catch (const std::exception& exc)
{
std::cout << exc.what() << std::endl;
}
_CrtDumpMemoryLeaks();
}
λ€μ 볡μ‘ν΄ λ³΄μ΄λλ°μ. unsigned char
λ₯Ό vector
λ‘ κ΅¬μ±νκ³ , μ΄λ₯Ό unique_ptr
λ‘ κ΄λ¦¬νλ λ°©μμ
λλ€. μ΄ κ²½μ°, μλμ κ°μ΄ μ§μ ν¬μΈν° μ£Όμμ μ κ·Όν μ μμ΅λλ€.
unsigned char* ptr = buffer->data();
μ΄λ κ² μ€λ§νΈ ν¬μΈν°λ₯Ό μ¬μ©νλ©΄ μ§μ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ μμλ μλμΌλ‘ κ΄λ¦¬ν΄ μ€λλ€. μ€λ§νΈ ν¬μΈν°μ λν μμΈν μ€λͺ μ μλ λ§ν¬λ₯Ό μ°Έκ³ νμΈμ.
'Programming > C++' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λκΈ
μ΄ κΈ κ³΅μ νκΈ°
-
ꡬλ
νκΈ°
ꡬλ νκΈ°
-
μΉ΄μΉ΄μ€ν‘
μΉ΄μΉ΄μ€ν‘
-
λΌμΈ
λΌμΈ
-
νΈμν°
νΈμν°
-
Facebook
Facebook
-
μΉ΄μΉ΄μ€μ€ν 리
μΉ΄μΉ΄μ€μ€ν 리
-
λ°΄λ
λ°΄λ
-
λ€μ΄λ² λΈλ‘κ·Έ
λ€μ΄λ² λΈλ‘κ·Έ
-
Pocket
Pocket
-
Evernote
Evernote
λ€λ₯Έ κΈ
-
[C++ DLL] ν΄λμ€λ₯Ό MFC νμ₯ DLLλ‘ λ§λ€κ³ μ¬μ©νκΈ° (μμ ν¬ν¨)
[C++ DLL] ν΄λμ€λ₯Ό MFC νμ₯ DLLλ‘ λ§λ€κ³ μ¬μ©νκΈ° (μμ ν¬ν¨)
2020.12.16 -
[C++ DLL] C++ ν΄λμ€λ₯Ό DLLλ‘ λ§λ€κ³ μ¬μ©νκΈ° (μμ ν¬ν¨)
[C++ DLL] C++ ν΄λμ€λ₯Ό DLLλ‘ λ§λ€κ³ μ¬μ©νκΈ° (μμ ν¬ν¨)
2020.12.13 -
[C++ DLL] Visual Studio C++ λͺ μμ λ§ν¬νκΈ° (μμ ν¬ν¨)
[C++ DLL] Visual Studio C++ λͺ μμ λ§ν¬νκΈ° (μμ ν¬ν¨)
2020.12.10 -
[C++ DLL] Visual Studio C++ μμμ λ§ν¬νκΈ° (μμ ν¬ν¨)
[C++ DLL] Visual Studio C++ μμμ λ§ν¬νκΈ° (μμ ν¬ν¨)
2020.12.07