36-3-³ª.auto_ptrÀÇ ³»ºÎ

auto_ptr ÅÛÇø´Àº Æ÷ÀÎÅ͸¦ Ŭ·¡½º·Î °¨½Î¼­ Æı«ÀÚ°¡ ÀÚµ¿À¸·Î ÇØÁ¦ÇÒ ¼ö ÀÖ´Â Æ÷ÀÎÅÍÀÇ ·¡ÆÛ Å¬·¡½º¶ó°í ÇÒ ¼ö ÀÖ´Ù. ÀÚµ¿À¸·Î Æı«µÈ´Ù´Â °Í ¿Ü¿¡´Â ¸ðµç µ¿ÀÛÀÌ ·¡ÇÎµÈ Æ÷ÀÎÅÍ¿Í µ¿ÀÏÇѵ¥ ÀÌ°ÍÀÌ ¾î¶»°Ô °¡´ÉÇÑÁö ¿¬±¸ÇØ º¸ÀÚ. auto_ptr Ŭ·¡½º ÅÛÇø´ÀÌ Á¤ÀǵǾî ÀÖ´Â memory Çì´õ ÆÄÀÏÀ» ÀÐ¾î º¸¸é ³»ºÎ¸¦ ¾î·ÆÁö ¾Ê°Ô ºÐ¼®ÇÒ ¼ö ÀÖ´Ù. ±æÀ̵µ ¾ó¸¶µÇÁö ¾ÊÀ¸¹Ç·Î C++ Äڵ带 Àß Àд »ç¶÷Àº ±Ý¹æ ±× ½Çü¸¦ ÆľÇÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±×·¯³ª auto_ptrÀÇ Á¤ÀÇ°¡ °£´ÜÇÏ´Ù°í´Â ÇÏÁö¸¸ ÄÄÆÄÀÏ·¯¸¶´Ù ±¸Çö ¹æ½ÄÀÌ Á¶±Ý¾¿ ´Ù¸£°í ÅÛÇø´ ¶§¹®¿¡ Äڵ尡 ´Ù¼Ò ³­ÇØÇÑ ºÎºÐµµ ÀÖÀ¸¹Ç·Î Ç¥ÁØ auto_ptrÀ» Á¶±Ý ´Ü¼øÈ­½ÃŲ Ŭ·¡½º·ÎºÎÅÍ ÀÚµ¿È­µÈ Æı« ¹æ½ÄÀ» ¿¬±¸ÇØ º¸µµ·Ï ÇÏÀÚ. ´ÙÀ½ ¿¹Á¦ÀÇ myptrÀº auto_ptrÀÇ ±â´É Áß ÀϺθ¸À» Èä³»³½ Ŭ·¡½ºÀÌµÇ ±æÀÌ°¡ ÈξÀ ´õ ª´Ù. ¾×±â½º¸¸ º¸ÀÚ´Â ¾ê±â´Ù.

 

¿¹ Á¦ : myptr

#include <Turboc.h>

#include <string>

#include <iostream>

using namespace std;

 

template <typename T>

class myptr

{

private:

     T *p;

 

public:

     explicit myptr(T *ap) : p(ap) { }

     ~myptr() { delete p; }

     T& operator *() const { return *p; }

     T* operator ->() const { return p; }

};

 

void main()

{

     myptr<string> pStr(new string("AutoPtr Test"));

 

     cout << *pStr << endl;

     cout << "±æÀÌ = " << pStr->size() << endl;

}

 

myptrÀº Àμö·Î Àü´ÞµÈ ´ë»óü T¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¨½Î´Â ·¡ÆÛ Å¬·¡½ºÀÌ´Ù. Ŭ·¡½º ÅÛÇø´À̹ǷΠÀÓÀÇ Å¸ÀÔÀÇ Æ÷ÀÎÅ͸¦ ·¡ÇÎÇÒ ¼ö ÀÖ´Ù. ¸â¹ö º¯¼ö·Î T *ÇüÀÇ p¸¦ ¼±¾ðÇÏ°í Àִµ¥ ÀÌ Æ÷ÀÎÅÍ´Â »ý¼ºÀÚ¿¡¼­ ÃʱâÈ­µÈ´Ù. main¿¡¼­ myptr<string> ŸÀÔÀÇ pStrÀ» ¼±¾ðÇÏ°í new string¹®À¸·Î »õ·Î¿î string °´Ã¼¸¦ µ¿Àû ÇÒ´çÇÏ¿© ±× Æ÷ÀÎÅ͸¦ »ý¼ºÀÚ·Î Àü´ÞÇß´Ù. ÀÌ·¸°Ô µÇ¸é myptrÀÇ ¸â¹ö p´Â µ¿Àû ÇÒ´çµÈ string °´Ã¼¸¦ °¡¸®Å³ °ÍÀÌ´Ù.

ÀÌ »óÅ¿¡¼­ *¿¬»êÀÚ·Î myptrÀ» ÀÐÀ¸¸é ÀÌ ¿¬»êÀÚ°¡ *p¸¦ ´ë½Å ¸®ÅÏÇÑ´Ù. ±×·¡¼­ myptr¿¡ °¡ÇØÁö´Â ¿¬»êÀº p°¡ °¡¸®Å°´Â °´Ã¼, ±×·¯´Ï±î ÀÌ ¿¹Á¦ÀÇ °æ¿ì µ¿Àû ÇÒ´çµÈ string °´Ã¼¸¦ ´ë»óÀ¸·Î ÇÏ°Ô µÈ´Ù. *pStrÀ» ÀÐÀ¸¸é "AutoPtr Test"¶ó´Â ¹®ÀÚ¿­ÀÌ ÀÐÇôÁú °ÍÀÌ´Ù. ¸â¹ö ÂüÁ¶ ¿¬»êÀÚÀÎ ->µµ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ¿¬»êÀÚ·Î ·¡ÇÎµÈ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °´Ã¼ÀÇ ¸â¹ö¸¦ ¹Ù·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. mainÀÌ Á¾·áµÉ ¶§ myptrÀÇ Æı«ÀÚ°¡ È£ÃâµÇ°í ¿©±â¼­ delete ¿¬»êÀÚ·Î p¸¦ »èÁ¦ÇÔÀ¸·Î½á p°´Ã¼ ÀÚü¿Í p°¡ »ç¿ëÇÏ´Â ºÎ°¡ ¸Þ¸ð¸®±îÁöµµ ÀÚµ¿À¸·Î Á¤¸®µÇ´Â °ÍÀÌ´Ù.

myptrÀº auto_ptrÀÇ ±â´É Áß »ý¼ºÀÚ, Æı«ÀÚ, *¿¬»êÀÚ, ->¿¬»êÀÚ¸¸À» Èä³»³»°í Àִµ¥ ÀÌ ¿¹Á¦¸¸À¸·Îµµ ÀÚµ¿È­µÈ Æı«°¡ ¾î¶»°Ô °¡´ÉÇÑÁö¸¦ ÀÌÇØÇϱ⿡´Â ÃæºÐÇÏ´Ù. auto_ptrÀº ÀÌ ¿Ü¿¡µµ ´ëÀÔ ¿¬»êÀÚ, º¹»ç »ý¼ºÀÚ, ȣȯ ŸÀÔÀ¸·ÎÀÇ º¯È¯ ¿¬»êÀÚ µîÀ» Ãß°¡·Î ´õ Á¤ÀÇÇÏ¿© °´Ã¼¿¡ ´ëÇÑ ¸ðµç ¿¬»êÀÌ Æ÷ÀÎÅÍ¿¡ ´ëÇÑ ¿¬»êÀÌ µÇµµ·Ï ÇÑ´Ù. Æ÷ÀÎÅÍÀÇ ±â´É¿¡ ÀÚµ¿È­µÈ Æı« ±â´É¸¸À» ´õÇÑ °ÍÀÌ ¹Ù·Î auto_ptrÀÌ´Ù.

¿¹Á¦ÀÇ myptrÀº ¹°·ÐÀÌ°í auto_ptrµµ »ý¼ºÀÚ´Â explicit·Î ¼±¾ðµÇ¾î ÀÖ¾î ¸í½ÃÀûÀÎ º¯È¯¸¸ Çã¿ëÇϴµ¥ ¾Ï½ÃÀûÀÎ º¯È¯±îÁö Çã¿ëÇÒ °æ¿ì ´ÙÀ½°ú °°Àº Äڵ嵵 ÀÌ»ó¾øÀÌ ÄÄÆÄÀÏµÇ¾î ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

 

myptr<int> mpi(new int);

int i,*pi=&i;

mpi=pi;

 

»ý¼ºÀÚ°¡ explicit°¡ ¾Æ´Ï¶ó¸é Á¤¼öÇü Æ÷ÀÎÅÍ º¯¼ö pi·ÎºÎÅÍ Àӽà myptr °´Ã¼¸¦ »ý¼ºÇÑ ÈÄ ÀÌ °´Ã¼¸¦ mpi¿¡ ±×´ë·Î ´ëÀÔÇØ ¹ö¸± °ÍÀÌ´Ù. myptr<int>¿Í int *´Â ´Ù¸¥ ŸÀÔÀ̹ǷΠ´ëÀÔ¿¡ ÀÇÇÑ ¾Ï½ÃÀû º¯È¯Àº ¾î¿ï¸®Áö ¾Ê´Â´Ù. ¹Ýµå½Ã ¸í½ÃÀûÀ¸·Î »ý¼ºÀÚÀÇ Àμö·Î ³Ñ±æ ¶§¸¸ ÀÌ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ µé¿©¾ß ÇÑ´Ù.

´ÙÀ½Àº auto_ptr ÅÛÇø´À» »ç¿ëÇÒ ¶§ÀÇ ÀϹÝÀûÀÎ ÁÖÀÇ »çÇ×°ú ÇÑ°è¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ´ÙÀ½ ÄÚµå´Â Á¤¼öÇüÀÇ Æ÷ÀÎÅ͸¦ ·¡ÇÎÇÏ´Â auto_ptr °´Ã¼ api¸¦ ¼±¾ðÇÑ ¿¹Àε¥ ¾ÆÁÖ ÀüÇüÀûÀ̸鼭 Á¤»óÀûÀÎ ÄÚµåÀÌ´Ù.

 

auto_ptr<int> api(new int(1234));

 

Á¤¼öÇü Æ÷ÀÎÅ͸¦ ·¡ÇÎÇÏ´Â api¿¡ Á¤¼öÇü º¯¼ö¸¦ ÇÒ´çÇؼ­ Àü´ÞÇßÀ¸¹Ç·Î ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª ´ÙÀ½°ú °°ÀÌ Á¤ÀûÀ¸·Î ÇÒ´çÇÑ º¯¼öÀÇ ¹øÁö´Â Àü´ÞÇÒ ¼ö ¾ø´Ù.

 

int i=1234;

auto_ptr<int> api(&i);

 

¿Ö³ÄÇϸé auto_ptrÀÇ Æı«ÀÚ´Â ¹«Á¶°Ç delete ¿¬»êÀÚ·Î Æ÷ÀÎÅ͸¦ »èÁ¦Çϵµ·Ï µÇ¾î Àִµ¥ À§ ÄÚµåÀÇ iº¯¼ö´Â Èü¿¡ ÇÒ´çµÈ °ÍÀÌ ¾Æ´Ï¶ó ½ºÅÿ¡ »ý¼ºµÈ °ÍÀ̹ǷΠÇØÁ¦ÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. ÄÄÆÄÀÏÀº µÇÁö¸¸ ÇØÁ¦ÇÒ ¶§ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. int i, *pi=&i; delete pi; Äڵ带 ¼ø¼­´ë·Î ½ÇÇàÇßÀ» ¶§ ¿¡·¯°¡ ¹ß»ýÇÏ´Â °Í°ú ¶È°°Àº ÀÌÀ¯ÀÌ´Ù. ´ÙÀ½ Äڵ嵵 ºÒ°¡´ÉÇÏ´Ù.

 

auto_ptr<int> api((int *)malloc(sizeof(int)));

 

mallocÀº free¿Í ¦À̹ǷΠmallocÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ delete·Î ÇØÁ¦ÇÒ ¼ö´Â ¾ø´Ù. auto_ptrÀÇ Æı«ÀÚ´Â ¹«Á¶°Ç delete·Î Æ÷ÀÎÅ͸¦ ÇØÁ¦Çϵµ·Ï µÇ¾î ÀÖ´Ù. ÀÚ½ÅÀÌ ·¡ÇÎÇÏ°í ÀÖ´Â Æ÷ÀÎÅÍ°¡ new¿¡ ÀÇÇØ ÇÒ´çµÇ¾ú´Ù°í °¡Á¤ÇÏ´Â °ÍÀÌ´Ù. ±×·¡¼­ ´ÙÀ½ Äڵ嵵 Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.

 

auto_ptr<int> api(new int[10]);

 

new ¿¬»êÀÚ·Î Á¤¼öÇü º¯¼ö 10°³ºÐÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© auto_ptr·Î ³Ñ°å´Âµ¥ °ü¸®´Â Àß µÇÁö¸¸ Æı«ÇÒ ¶§ delete [ ]°¡ ¾Æ´Ñ delete·Î ÇØÁ¦Çϸé ÀÌ °æ¿ìµµ ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÑ´Ù. auto_ptrÀº ¿À·ÎÁö new ¿¬»êÀÚ·Î ÇÒ´çÇÑ ´ë»ó¸¸ ÀÚµ¿À¸·Î Æı«ÇÒ ¼ö ÀÖÀ¸¸ç mallocÀ¸·Î ÇÒ´çÇ߰ųª new [ ]·Î ÇÒ´çÇÑ ´ë»óÀº ÇØÁ¦ÇÏÁö ¸øÇÑ´Ù. ¸¸¾à Á¤ ÀÌ·± ÇØÁ¦µµ ÀÚµ¿À¸·Î ÇÏ°í ½Í´Ù¸é auto_array, auto_free µîÀÇ ÅÛÇø´ Ŭ·¡½º¸¦ ¸¸µé¾î ¾µ ¼ö´Â ÀÖÀ» °ÍÀÌ´Ù.

auto_ptr °´Ã¼³¢¸® ´ëÀÔÇßÀ» ¶§ µÎ °³ÀÇ ´ë»óÀ» °°Àº °´Ã¼°¡ °¡¸®Å°´Â »óȲÀÌ µÉ ¼öµµ ÀÖ´Ù. ÀÌ·¸°Ô µÇ¸é µÎ °´Ã¼°¡ °³º°ÀûÀ¸·Î ÇØÁ¦µÉ ¶§ ÀÌÁß ÇØÁ¦¿¡ ÀÇÇÑ ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. auto_ptrÀº ´ëÀÔÇÒ ¶§ ¿ìº¯ °´Ã¼°¡ ·¡ÇÎÇÏ°í ÀÖ´Â Æ÷ÀÎÅÍÀÇ ¼ÒÀ¯±ÇÀ» Æ÷±âÇÏ°í ÀÚ½ÅÀ» ½º½º·Î ¹«È¿È­ÇÔÀ¸·Î½á ÀÌÁßÇØÁ¦ÀÇ À§ÇèÀ» ÇÇÇϸç delete ¿¬»êÀÚ´Â NULL Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¾Æ¹«·± µ¿ÀÛµµ ÇÏÁö ¾ÊÀ½À¸·Î½á ¹«È¿È­µÈ °´Ã¼µµ º° ÀÌ»ó¾øÀÌ µðÆúÆ® ó¸®ÇÑ´Ù.

±×·¯³ª ÀÌ ¹æ¹ýÀº ´ëÀÔ ¿¬»ê¿¡ ÀÇÇØ ÇÑÂÊÀÇ auto_ptr °´Ã¼°¡ ¹«È¿È­µÇ¸ç µÎ °´Ã¼°¡ ÇÑ ´ë»óÀ» °¡¸®Å°Áö ¸øÇÑ´Ù´Â ³í¸®ÀûÀÎ Ãë¾àÁ¡ÀÌ ÀÖ´Ù. ±×·¡¼­ Á» ´õ ¶È¶ÈÇÑ ·¡ÆÛ´Â °°Àº ´ë»óÀ» °¡¸®Å°´Â ȸ¼öÀÎ ÂüÁ¶ Ä«¿îÆ®¸¦ À¯ÁöÇÏ¸ç °´Ã¼°¡ ÇØÁ¦µÉ ¶§ Ä«¿îÆ®¸¸ 1 °¨¼ÒÇÏ°í Ä«¿îÆ®°¡ 0ÀÌ µÉ ¶§ ½ÇÁ¦ °´Ã¼¸¦ ÇØÁ¦ÇÏ´Â ¹æ¹ýÀ» ¾²±âµµ ÇÑ´Ù. ÀÌ·± ½ÄÀ¸·Î µ¿ÀÛÇÏ´Â Æ÷ÀÎÅ͸¦ ½º¸¶Æ® Æ÷ÀÎÅÍ(Smart Pointer:¹ø¿ªÇÏÀÚ¸é ¶È¶ÈÇÑ ³ð)¶ó°í Çϴµ¥ auto_ptrº¸´Ù´Â ÇÑ ´Ü°è ´õ ¹ßÀüÇÑ °³³äÀÌ´Ù. ½º¸¶Æ® Æ÷ÀÎÅÍ´Â COM ÇÁ·Î±×·¡¹Ö¿¡¼­ ÈçÈ÷ »ç¿ëµÈ´Ù.