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 ÇÁ·Î±×·¡¹Ö¿¡¼ ÈçÈ÷ »ç¿ëµÈ´Ù.