25-2-´Ù.new

new, delete´Â CÀÇ malloc, free¿¡ ´ëÀÀµÇ´Â C++ÀÇ ¸Þ¸ð¸® ÇÒ´ç ¿¬»êÀÚÀÌ¸ç ½ÇÇàÁß¿¡ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù´Â Á¡¿¡¼­ ¿ëµµ°¡ ºñ½ÁÇÏ´Ù. ÇÒ´ç ¿¬»êÀÚÀÎ newÀÇ ±âº» Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

 

Æ÷ÀÎÅÍ = new ŸÀÔ[(ÃʱⰪ)];

 

new ´ÙÀ½¿¡ ÇÒ´ç ´ë»ó ŸÀÔÀ» ¹àÈ÷¸é sizeof(ŸÀÔ)¸¸Å­ÀÇ ¸Þ¸ð¸®°¡ ÇÒ´çµÇ°í ÇÒ´çµÈ Æ÷ÀÎÅÍ°¡ ¸®ÅϵȴÙ. new°¡ ¸®ÅÏÇÏ´Â ¹øÁö´Â °°Àº ŸÀÔÀÇ Æ÷ÀÎÅÍ º¯¼ö·Î ´ëÀԹ޴´Ù. ÇÒ´ç°ú µ¿½Ã¿¡ ¸Þ¸ð¸®¸¦ ÃʱâÈ­ÇÏ°í ½ÍÀ¸¸é ŸÀÔ ´ÙÀ½ÀÇ °ýÈ£¿¡ ¿øÇÏ´Â ÃʱⰪÀ» ÀûµÇ ÃʱâÈ­¸¦ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸é »ý·«ÇÒ ¼ö ÀÖ´Ù. ÃʱâÈ­ÇÏÁö ¾ÊÀº ¸Þ¸ð¸®´Â ¹°·Ð ¾²·¹±â°ªÀ» °¡Áø´Ù. ¸Þ¸ð¸® ºÎÁ· µîÀÇ ÀÌÀ¯·Î ÇÒ´ç¿¡ ½ÇÆÐÇϸé NULLÀ» ¸®ÅÏÇϴµ¥ ¿øÄ¢ÀûÀ¸·Î ÀÌ ¸®ÅÏ°ªÀ» Á¡°ËÇØ º¸¾Æ¾ß ÇÏÁö¸¸ 32ºñÆ® ȯ°æ¿¡¼­´Â ½ÇÆÐÇÒ È®·üÀÌ °ÅÀÇ ¾ø¾î Á¡°ËÀ» »ý·«ÇÏ´Â °æ¿ìµµ ¸¹´Ù.

ÀÌ·¸°Ô ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÒ ¶§´Â delete ¿¬»êÀÚ¸¦ »ç¿ëÇϴµ¥ ÇØÁ¦ÇÒ Æ÷ÀÎÅ͸¦ delete ´ÙÀ½¿¡ ÁöÁ¤ÇÑ´Ù. ¸¸¾à ÇҴ縸 ÇÏ°í ÇØÁ¦¸¦ ÇÏÁö ¾ÊÀ¸¸é ¸Þ¸ð¸® ÀϺθ¦ »ç¿ëÇÒ ¼ö ¾ø°Ô µÇ´Â ¸Þ¸ð¸® ´©¼ö(Memory Leak)°¡ ¹ß»ýÇϹǷΠµ¿Àû ÇÒ´çÇÑ ¸Þ¸ð¸®´Â ¹Ýµå½Ã deleteÇØ¾ß ÇÑ´Ù. ÇÑ Æ÷ÀÎÅÍ¿¡ ´ëÇØ delete¸¦ µÎ ¹ø ÇÏ´Â °ÍÀº ¾ÈµÇÁö¸¸ NULL Æ÷ÀÎÅ͸¦ »èÁ¦ÇÏ´Â °ÍÀº °¡´ÉÇÏ´Ù. Áï ´ÙÀ½°ú °°ÀÌ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

 

if (pi != NULL) {

     delete pi;

}

 

delete´Â NULL Æ÷ÀÎÅÍ¿¡ ´ëÇؼ­´Â ¾Æ¹«·± µ¿ÀÛµµ ÇÏÁö ¾Êµµ·Ï Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ¾ÈÀüÇÏ´Ù. À§ Äڵ忡¼­ if¹®À¸·Î Á¡°ËÇÒ ÇÊ¿ä¾øÀÌ ¹«Á¶°Ç pi¸¦ ÇØÁ¦Çصµ »ó°ü¾ø´Ù. ´ÙÀ½Àº new, delete·Î Á¤¼öÇü º¯¼ö Çϳª¸¦ µ¿ÀûÀ¸·Î »ý¼ºÇØ º» °ÍÀÌ´Ù.

 

¿¹ Á¦ : newdelete

#include <Turboc.h>

 

void main()

{

     int *pi=new int;

     *pi=123;

     printf("*pi=%d\n",*pi);

     delete pi;

}

 

new¿¬»êÀÚ¿¡ ÀÇÇØ Á¤¼öÇü Çϳª¸¦ ÀúÀåÇÒ¸¸Å­ÀÇ °ø°£(4¹ÙÀÌÆ®)ÀÌ ÇÒ´çµÇ´Âµ¥ ÇÒ´çµÈ Æ÷ÀÎÅ͸¦ Á¤¼öÇü Æ÷ÀÎÅÍ º¯¼ö pi·Î ´ëÀÔ¹Þ¾Ò´Ù. Èü¿¡ ÇÒ´çµÈ 4¹ÙÀÌÆ®¸¦ pi°¡ °¡¸®Å°°í ÀÖÀ¸¸ç ÀÌÈÄ *pi´Â µ¿Àû ÇÒ´çµÈ Á¤¼öÇü º¯¼ö°¡ µÇ¸ç Á¤¼ö°ª Çϳª¸¦ ±â¾ïÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡¼­´Â *pi¿¡ 123À̶ó´Â Á¤¼ö°ªÀ» ´ëÀÔÇÏ°í È®ÀÎÀ» À§ÇØ Ãâ·Â¸¸ ÇØ º¸¾Ò´Ù. ´Ù »ç¿ëÇÏ°í ³­ ´ÙÀ½¿¡´Â delete pi·Î ÇØÁ¦ÇÑ´Ù. ´ÙÀ½Àº new ¿¬»êÀÚ·Î ½Ç¼öÇü°ú ¹®ÀÚÇü º¯¼ö¸¦ ÇÒ´çÇÏ´Â ¿¹ÀÌ´Ù.

 

double *pd=new double;

char *pc=new char;

 

pd¿¡´Â 8¹ÙÀÌÆ®°¡ ÇÒ´çµÇ°í pc¿¡´Â 1¹ÙÀÌÆ®°¡ ÇÒ´çµÉ °ÍÀÌ´Ù. Àß »ç¿ëµÇÁö´Â ¾ÊÁö¸¸ new int; ¶ó°í ¾²´Â ´ë½Å °ýÈ£¸¦ ½á¼­ new(int)¶ó°í ¾²´Â ¹æ¹ýµµ ÀÖÀ¸¸ç À̶§µµ new(int)(123) Çü½ÄÀ¸·Î ÃʱⰪÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. new/delete ¿¬»êÀÚ´Â malloc/free¿Í ±â´ÉÀûÀ¸·Î µ¿ÀÏÇϱ⠶§¹®¿¡ À§ ¿¹Á¦¸¦ ´ÙÀ½°ú °°ÀÌ °íÃÄ ½áµµ ¶È°°ÀÌ µ¿ÀÛÇÑ´Ù.

 

int *pi=(int *)malloc(sizeof(int));

*pi=123;

printf("*pi=%d\n",*pi);

free(pi);

 

new ´ë½Å mallocÀ» »ç¿ëÇß°í delete ´ë½Å free¸¦ »ç¿ëÇß´Ù. ¸Þ¸ð¸® ÇÒ´çÀÇ ¸é¿¡¼­¸¸ º»´Ù¸é new/delete´Â malloc/free¿Í µ¿ÀÏÇÏÁö¸¸ Â÷ÀÌÁ¡µµ ¸¹ÀÌ ÀÖ´Ù. new/delete´Â malloc/freeº¸´Ù ¸Þ¸ð¸®¸¦ °ü¸®ÇÏ´Â ¹æ½ÄÀÌ ÈξÀ ´õ Áøº¸ÀûÀÌ¸ç ¼Óµµµµ ºü¸£°í OOP¿¡ ÀûÇÕÇÑ Æ¯Â¡µéÀ» ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. ¾î¶² Á¡ÀÌ ´Ù¸¥Áö º¸ÀÚ.

 

¨ç malloc/free´Â ¶óÀ̺귯¸®°¡ Á¦°øÇÏ´Â ÇÔ¼öÀε¥ ºñÇØ new/delete´Â ¾ð¾î°¡ Á¦°øÇÏ´Â ¿¬»êÀÚÀÌ´Ù. ±×·¡¼­ º°µµÀÇ Çì´õ ÆÄÀÏÀ» Æ÷ÇÔÇÒ ÇÊ¿ä¾øÀÌ ¾ðÁ¦µçÁö »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ ¿¬»êÀÚ¸¦ ¾´´Ù°í Çؼ­ ÇÁ·Î±×·¥ÀÌ Ä¿Áö´Â °Íµµ ¾Æ´Ï´Ù. ¿¬»êÀÚÀ̱⠶§¹®¿¡ »ç¿ëÀÚ Á¤ÀÇ Å¸ÀÔ¿¡ ´ëÇØ ¿À¹ö·ÎµùÇÒ ¼öµµ ÀÖ´Ù.

¨è malloc ÇÔ¼ö´Â ÇÊ¿äÇÑ ¸Þ¸ð¸®¾çÀ» ¹ÙÀÌÆ® ´ÜÀ§·Î ÁöÁ¤ÇÏ°í void *¸¦ ¸®ÅÏÇϹǷΠsizeof ¿¬»êÀÚ¿Í Ä³½ºÆ® ¿¬»êÀÚÀÇ µµ¿òÀ» ¹Þ¾Æ¾ß ÇÑ´Ù. ÀÌ¿¡ ºñÇØ new´Â ÇÒ´çÇÒ Å¸ÀÔÀ» ÁöÁ¤ÇÏ°í ÇØ´ç ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϹǷΠsizeof ¿¬»êÀÚ¿Í Ä³½ºÆ® ¿¬»êÀÚ¸¦ ¾µ ÇÊ¿ä°¡ ¾ø´Ù. ÇÒ´çÇÑ Å¸ÀÔ°ú °°Àº ŸÀÔÀÇ Æ÷ÀÎÅÍ º¯¼ö·Î ´ëÀÔ¸¸ ¹ÞÀ¸¸é µÈ´Ù.

¨é mallocÀº ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ´Â °Í¸¸ÀÌ ¸ñÀûÀ̹ǷΠÃʱⰪÀ» ÁÙ ¼ö ¾øÁö¸¸ new ¿¬»êÀÚ´Â µ¿ÀûÀ¸·Î »ý¼ºÇÑ º¯¼öÀÇ ÃʱⰪÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. Áï ÇÒ´ç°ú µ¿½Ã¿¡ ÃʱâÈ­¸¦ ÇÒ ¼ö Àִµ¥ ÇÒ´ç ŸÀÔ ´ÙÀ½ÀÇ °ýÈ£¿¡ ÃʱⰪÀ» Àû¾î ÁÖ¸é µÈ´Ù. int *pi=new int; *pi=123; µÎ ¹®ÀåÀº int *pi=new int(123); Çϳª·Î ÇÕÄ¥ ¼ö ÀÖ´Ù.

¨ê new ¿¬»êÀÚ·Î °´Ã¼¸¦ ÇÒ´çÇÒ ¶§ »ý¼ºÀÚ°¡ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù. »ý¼ºÀÚ¶õ °´Ã¼¸¦ ÀÚµ¿À¸·Î ÃʱâÈ­Çϴ Ưº°ÇÑ ÇÔ¼öÀε¥ ´ÙÀ½ Àå¿¡¼­ ¹è¿ì°Ô µÉ °ÍÀÌ´Ù. »ý¼ºÀÚ´Â »ý¼º°ú µ¿½Ã¿¡ °´Ã¼¸¦ ÃʱâÈ­ÇÒ ¼ö ÀÖµµ·Ï ÇÔÀ¸·Î½á Ŭ·¡½º°¡ ±âÁ¸ ŸÀÔ°ú µ¿µîÇÑ ÀÚ°ÝÀ» °¡Áöµµ·Ï ÇÏ´Â Áß¿äÇÑ ¿ªÇÒÀ» ÇÑ´Ù. »ý¼ºÀÚ¸¦ È£ÃâÇÑ´Ù´Â Á¡ÀÌ malloc°ú newÀÇ °¡Àå Å« Â÷ÀÌÁ¡À̸ç C++¿¡¼­ º°µµÀÇ ÇÒ´ç ¿¬»êÀÚ°¡ Ãß°¡µÈ ÀÌÀ¯ÀÌ´Ù. ¸¶Âù°¡Áö·Î delete·Î °´Ã¼¸¦ »èÁ¦ÇÒ ¶§´Â Æı«ÀÚ¶ó´Â Ưº°ÇÑ ÇÔ¼ö°¡ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù.

 

new ¿¬»êÀÚ´Â ±âº» ŸÀÔ»Ó¸¸ ¾Æ´Ï¶ó ±¸Á¶Ã¼³ª ¹è¿­, »ç¿ëÀÚ Á¤ÀÇÇü ŸÀÔµµ ÇÒ´çÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº new ¿¬»êÀÚ·Î ±¸Á¶Ã¼¸¦ ÇÒ´çÇÏ´Â ¿¹Á¦ÀÌ´Ù.

 

¿¹ Á¦ : newstruct

#include <Turboc.h>

 

struct tag_Friend {

   char Name[10];

   int Age;

   double Height;

};

 

void main()

{

     tag_Friend *pF=new tag_Friend;

     strcpy(pF->Name,"¾Æ¹«°³");

     pF->Age=22;

     pF->Height=177.7;

     printf("À̸§=%s, ³ªÀÌ=%d, Å°=%.1f\n",pF->Name,pF->Age,pF->Height);

     delete pF;

}

 

new ¿¬»êÀÚ¿¡ ÀÇÇØ sizeof(tag_Friend)¸¸Å­ÀÇ ¸Þ¸ð¸®°¡ ÇÒ´çµÇ°í tag_Friend * ŸÀÔÀÌ ¸®ÅϵȴÙ. ±¸Á¶Ã¼¸¦ ÇÒ´ç°ú µ¿½Ã¿¡ ÃʱâÈ­ÇÏ·Á¸é ´ÙÀ½ Àå¿¡¼­ ¹è¿ï »ý¼ºÀÚ ÇÔ¼ö¶ó´Â °ÍÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ¹è¿­À» ÇÒ´çÇÏ´Â ¹æ¹ýÀº Á¶±Ý Ư¼öÇÏ´Ù. ÇÒ´ç ŸÀÔ ´ÙÀ½ÀÇ [ ] ¾È¿¡ ¹è¿­ÀÇ Å©±â¸¦ ÁöÁ¤Çϴµ¥ ´ÙÀ½Àº Á¤¼öÇü ¹è¿­À» ÇÒ´çÇÏ´Â ¿¹ÀÌ´Ù.

 

¿¹ Á¦ : newarray

#include <Turboc.h>

 

void main()

{

     int *ar=new int[5];

     int i;

     for (i=0;i<5;i++) {

          ar[i]=i;

     }

     for (i=0;i<5;i++) {

          printf("%d¹ø° = %d\n",i,ar[i]);

     }

     delete [] ar;

}

 

new int[5];¿¡ ÀÇÇØ Á¤¼öÇü º¯¼ö 5°³¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®°¡ ÇÒ´çµÇ¸ç int * ŸÀÔÀÌ ¸®ÅϵȴÙ. ¸®ÅÏ°ªÀ» int *ÇüÀÇ ar·Î ´ëÀÔ¹ÞÀ¸¸é arÀº Á¤¼öÇü ¹è¿­°ú µ¿µîÇÏ¸ç ¹è¿­Ã³·³ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹è¿­À» ÇÒ´çÇÒ ¶§´Â new¿¬»êÀڷεµ ÃʱⰪÀ» ÁöÁ¤ÇÒ ¼ö ¾ø´Ù. µ¿ÀûÀ¸·Î ÇÒ´çÇÏ´Â °ÍÀ̹ǷΠÇÒ´çÇÒ ¹è¿­ÀÇ Å©±â¸¦ ÁöÁ¤ÇÏ´Â °ªÀÌ ²À »ó¼ö¿©¾ß ÇÒ ÇÊ¿ä´Â ¾øÀ¸¸ç º¯¼ö·Îµµ Å©±â¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. Áï ´ÙÀ½°ú °°Àº Äڵ嵵 °¡´ÉÇÏ´Ù.

 

int n;

printf("µµ´ëü ¸î °³³ª ÇÊ¿äÇÏ´Ï? : ");

scanf("%d",&n);

int *ar=new int[n];

 

µ¿ÀûÀ¸·Î ÇÒ´çÇÑ ¹è¿­À» »èÁ¦ÇÒ ¶§´Â delete ´ë½Å ¹Ýµå½Ã delete [ ] ¹®À» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¸Áö ¾Ê¾ÒÀ» ¶§ ±×·¯´Ï±î ÇÒ´çÀº new [ ]·Î ÇØ ³õ°í ÇØÁ¦´Â delete·Î ÇßÀ» ¶§ÀÇ µ¿ÀÛÀº Á¤ÀǵǾî ÀÖÁö ¾ÊÀ¸¸ç(Undefined) »óȲ¿¡ µû¶ó ´Ù¸£´Ù. ÀϹÝÀûÀ¸·Î ¹è¿­ÀÇ Ã¹ ¹ø° ¿ä¼Ò¿¡ ´ëÇؼ­¸¸ Æı«ÀÚ°¡ È£ÃâµÇ°í ³ª¸ÓÁö´Â Æı«ÀÚ°¡ È£ÃâµÇÁö ¾ÊÀ¸¹Ç·Î ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ¶Ç´Â ÇÒ´ç Çì´õÀÇ ±¸Á¶°¡ ´Þ¶ó ù ¹ø° ¿ä¼Ò°¡ Á¦´ë·Î Æı«µÇ±â Àü¿¡ ´Ù¿îµÉ ¼öµµ Àִµ¥ Á¤ÀǵÇÁö ¾ÊÀº µ¿ÀÛÀÇ °á°ú´Â ÄÄÆÄÀÏ·¯¿¡ µû¶ó ´Þ¶óÁø´Ù. ÈçÈ÷ ¸¹ÀÌ ½Ç¼öÇÏ´Â ºÎºÐÀ̹ǷΠµ¿Àû ÇÒ´çÇÑ ¹è¿­Àº delete [ ]·Î ÇØÁ¦ÇÑ´Ù´Â °ÍÀ» ²À ±â¾ïÇØ ³õµµ·Ï ÇÏÀÚ. Áß¿äÇÑ ³»¿ëÀ̹ǷΠÇÑ ¹ø ´õ ¹Ýº¹ÇÑ´Ù. new´Â delete¿Í ¦ÀÌ°í new [ ]´Â delete [ ]¿Í ¦ÀÌ´Ù.

new/deleteÀÇ °¡Àå Å« ÀåÁ¡Àº °´Ã¼°¡ »ý¼º, Æı«µÉ ¶§ »ý¼ºÀÚ¿Í Æı«ÀÚ°¡ È£ÃâµÈ´Ù´Â Á¡Àε¥ ÀÌ¿¡ ´ëÇؼ­´Â ´ÙÀ½¿¡ µû·Î ¿¬±¸ÇØ º¼ °ÍÀÌ´Ù. ÀÌ Á¡¸¸ Á¦¿ÜÇϸé malloc/free¿Í Å« Â÷ÀÌÁ¡Àº ¾ø´Ù. C++¿¡¼­´Â °¡±ÞÀûÀ̸é malloc/free ´ë½Å new/delete¸¦ »ç¿ëÇÒ °ÍÀ» ±ÇÀåÇÏÁö¸¸ ¹Ýµå½Ã ±×·¡¾ß ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ´Ü¼øÈ÷ ¸Þ¸ð¸® ÇҴ縸 ÇÑ´Ù¸é malloc/freeµµ ¾ÆÁ÷±îÁö ¾µ¸¸ÇÏ¸ç ¿ÀÈ÷·Á ´õ Æí¸®ÇÑ ¸éµµ ÀÖ´Ù.

¿¹¸¦ µé¾î mallocÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â reallocÀ¸·Î Å©±â¸¦ ¹Ù²ã ÀçÇÒ´çÇÒ ¼ö ÀÖÁö¸¸ new¿¡´Â ÀÌ¿¡ ´ëÀÀÇÏ´Â ±â´ÉÀÌ ¾ø¾î »õ·Î ÇÒ´çÇÏ¿© º¹»çÇÏ°í ¿ø·¡ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ´Â °úÁ¤À» Á÷Á¢ ÇØ¾ß ÇÑ´Ù. ±×·¡¼­ ÀçÇÒ´çÇÒ ¶§¸¶´Ù ¸Å¹ø ¹øÁö°¡ ¹Ù²î¸ç ½ÉÁö¾î Ãà¼ÒÇÒ ¶§µµ ¹øÁö°¡ ¹Ù²ï´Ù. ¶ÇÇÑ ½ÇÇàÁß¿¡ ÇÒ´ç ºí·ÏÀÇ Å©±â¸¦ Á¶»çÇÏ´Â _msize¿¡ ÇØ´çÇÏ´Â ±â´Éµµ ¾ø´Ù. ÇÒ´ç ´ë»óÀÌ °´Ã¼°¡ ¾Æ´Ï°í ÀçÇÒ´çÀ» ºó¹øÇÏ°Ô ÇÑ´Ù¸é malloc/free¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ°í °´Ã¼¸¦ ÇÒ´çÇÒ ¶§´Â ¹Ýµå½Ã new/delete¸¦ ½á¾ß ÇÑ´Ù. ´Ü, ÇÒ´ç, ÇØÁ¦ ÇÔ¼ö´Â ¹Ýµå½Ã ¦À» ¸ÂÃß¾î¾ß ÇÏ¸ç ¼¯¾î¼­ ¾µ ¼ö´Â ¾ø´Ù. new·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â ¹Ýµå½Ã delete·Î ÇØÁ¦ÇØ¾ß ÇÏ°í mallocÀ¸·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â free·Î ÇØÁ¦ÇÑ´Ù.