cpp_RAII - 8BitsCoding/RobotMentor GitHub Wiki

RAII(Resource Acquisition is Initialization)

RAII ์ •์˜ : ์ž์›์„ ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ์Šค์ฝ”ํ”„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ž์›์„ ํ•ด์ œํ•ด์ฃผ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.


Simple Example

// Example
void Func() {
      ClassB * B = new ClassB();
      // do something.
      delete B;
}
// ์œ„ ์ฝ”๋“œ๋Š” ์ข‹์ง€ ๋ชปํ•œ ์ฝ”๋“œ


void Func() {
      ClassB B;
}

์šฐ์„  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ์˜ˆ์ธกํ•ด๋ณด์ž.

#include <pthread.h> 

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

void* do_loop(void *data)
{
    pthread_mutex_lock(&mutex);

    // Do anything.

    pthread_mutex_unlock(&mutex);
}

๋А๋‚Œ์ด ์˜ค๊ฒ ์ง€๋งŒ ์ฝ”๋“œ์˜ Do anything์—์„œ ์ฝ”๋“œ๊ฐ€ ์ฃฝ์„ ์‹œ ๋ฐ๋“œ๋ฝ์ด ๋ฐ•์ƒํ•˜๊ฒŒ๋œ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€??

pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;

class Lock {
private:
    pthread_mutex_t  m_mutex = PTHREAD_MUTEX_INITIALIZER;
public:
    explicit Lock(pthread_mutex_t mutex) {pthread_mutex_lock(&mutex); m_mutex = mutex;};
    ~Lock() {pthread_mutex_unlock(&mutex);};
}

void * do_loop(void* data)
{
    Lock mylock(&mutex);
    // Do anything
    // ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์†Œ๋ฉธ์ž ํ˜ธ์ถœ๋จ.
}

RAII์˜ ๋‹ค๋ฅธ Example1

int function_A() {
    std::tr1::shared_ptr<dog> pd(new dog());

    // dog pd = new dog();
    // ์ผ ๊ฒฝ์šฐ dog ํ• ๋‹น๋œ dog๋Š” ํ•ด๋‹นํ•จ์ˆ˜์—์„œ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›Œ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒํ•œ๋‹ค.

    // ํ•ด๊ฒฐ์ฑ… -> shared_ptr
    // ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•.
    // ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜
}

RAII์˜ ๋‹ค๋ฅธ Example2

class dog;
class Trick;

void train(tr1::shared_ptr<dog> pd, Trick dogtrick);
Trick getTrick();

int main() {
    tr1::shared_ptr<dog> pd(new dog());
    train(pd, getTrick());
}

์Šค๋งˆํŠธํฌ์ธํ„ฐ
explicit
์ฐธ๊ณ ์‚ฌ์ดํŠธ
์œ ํˆฌ๋ธŒ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ