C¿¡¼´Â, ¸Þ¸ð¸®ÀÇ ÇÒ´ç°ú ÇØÁ¦¸¦ À§ÇØ malloc()°ú free()¸¦ ºñ·ÔÇÑ malloc()°è¿ÀÇ ÇÔ¼ö¸¦ ¾²Áö¸¸, ´Ùµé ´ÜÁ¡À» °®°í ÀÖ´Ù. ±×·¡¼ C++ Àº ¸Þ¸ð¸®¸¦ ´Ù·ç±â À§ÇÑ ¿¬»êÀÚµéÀ» µµÀÔÇß°í, À̵éÀº new ¿Í deleteÀÌ´Ù. ÀÌ ¿¬»êÀÚµéÀº ½ÇÇà½Ã¿¡ Èü(heap - ȤÀº ÀÚÀ¯ °ø°£)À¸·ÎºÎÅÍ ¸Þ¸ð¸®¸¦ ÇÒ´ç, ÇØÁ¦ÇÑ´Ù.
C++¿¡¼´Â Á¤¸»·Î ²À malloc()À̳ª free()¸¸À» ½á¾ßÇÏ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é ¾ðÁ¦³ª new ¿Í delete¸¦ ½á¾ßÇÑ´Ù. ±×·¯³ª ÁÖÀÇÇÒ Á¡Àº, ÀÌ µÎ °¡Áö¸¦ ¼¯¾î¼ ¾²¸é ¾ÈµÈ´Ù´Â °ÍÀÌ´Ù. malloc()À¸·Î ¾òÀº ¸Þ¸ð¸®¸¦ delete·Î ÇØÁ¦ÇÒ ¼ö´Â ¾ø°í, ¹Ý´ë·Î new·Î ¾òÀº ¸Þ¸ð¸®¸¦ free()½Ãų ¼öµµ ¾ø´Ù.
C++¿¡¼ÀÇ delete ¿Í new ¿¬»êÀÚ´Â CÀÇ malloc, freeº¸´Ù ³´´Ù. µû¶ó¼ malloc°ú free ´ë½Å new¿Í zap(delete)¸¦ ¾²µµ·Ï ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
delete ¿¬»êÀÚ°¡ Á» ´õ ±ò²ûÇÏ°Ô »ç¿ëµÇ°Ô ÇϱâÀ§ÇØ ´ÙÀ½°ú °°Àº Zap() inline ÇÔ¼ö¸¦ ¸¸µéÀÚ. ´ÙÀ½°ú °°ÀÌ zap()À» Á¤ÀÇÇÏÀÚ.
// x°¡ NULLÀÎÁö üũÇϱâ À§ÇØ assert¸¦ »ç¿ëÇÏ¿´´Ù. // ÀÌ´Â ÇÁ·Î±×·¥ÀÇ "³í¸®Àû" ¿¡·¯¸¦ ¹Ì¸® Àâ¾Æ³»±â À§ÇÑ °ÍÀÌ´Ù. // delete°¡ NULLÀÎ °æ¿ì¿¡µµ Àß µ¿ÀÛÇϱä ÇÏÁö¸¸, assert¸¦ // »ç¿ëÇÔÀ¸·Î½á Á» ´õ ÀÏÂï ¿¡·¯¸¦ Àâ¾Æ³¾ ¼ö ÀÖ´Ù. // ZapÀ» templateÀ» »ç¿ëÇÏ¿© Á¤ÀÇÇÏÀÚ. // delete´ë½Å zapÀ» »ç¿ëÇÏ¸é ´õ ±ò²ûÇÒ °ÍÀÌ´Ù. template <class T> inline void zap(T & x) { {assert(x != NULL);} delete x; x = NULL; } // C++¿¡ µÎ °¡Áö delete ¿¬»êÀÚÀÇ ¿ë¹ýÀÌ ÀÖ´Â ÀÌÀ¯´Â C++ ¿¡°Ô // ÇÑ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í °´Ã¼ÀÇ ¹è¿¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ±¸º°Çϵµ·Ï // ¸»ÇØÁÖ´Â ¹æ¹ýÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. // delete¿¬»êÀÚ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô "[]"¸¦ ¾²°ÔÇÔÀ¸·Î½á À̸¦ ±¸º°ÇÑ´Ù. // µû¶ó¼ ¿ì¸®´Â Æ÷ÀÎÅÍÀÇ ¹è¿À» Áö¿ì±â À§ÇÑ zaparr ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù template <class T> inline void zaparr(T & x) { {assert(x != NULL);} delete [] x; x = NULL; } |
zap()ÇÔ¼ö´Â Æ÷ÀÎÅ͸¦ delete½Ã۰í NULL·Î ¼¼ÆÃÇÑ´Ù. ÀÌ´Â ¶È°°Àº delete Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¿©·¯¹øÀÇ zap()ÀÌ ºÒ·Á¼ ÇÁ·Î±×·¥ÀÌ ¸Á°¡Áö´Â °ÍÀ» ¹æÁöÇÑ´Ù. ´ÙÀ½ÀÇ zap_example()ÇÔ¼ö¸¦ º¸¾Æ¶ó. example_String.cpp 'Source code of C++'À» Ŭ¸¯Çضó.
// example_String.cpp¿¡¼ zap_example()¸¦ º¸¶ó. zap(pFirstname); //zap(pFirstname); // pFirstnameÀÌ NULLÀ̹ǷΠÄÚ¾î ´ýÇÁ°¡ ÀϾÁö ¾Ê´Â´Ù. //zap(pFirstname); // pFirstnameÀÌ NULLÀ̹ǷΠÄÚ¾î ´ýÇÁ°¡ ÀϾÁö ¾Ê´Â´Ù. zap(pLastname); zap(pJobDescription); int *iiarray = new int[10]; zaparr(iiarray); |
¹¹ Ưº°ÇÑ °ÍÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï°í, À̰ÍÀº ´ÜÁö ¹Ýº¹ÀûÀÎ Äڵ带 ÁÙÀ̰í ŸÀÌÇÎÇÏ´Â ½Ã°£À» ¾Æ²¸ÁÖ¸ç ÇÁ·Î±×·¥À» Á» ´õ Àбâ ÁÁ°Ô ¸¸µé¾îÁÖ´Â °Í »ÓÀÌ´Ù. C++ ÇÁ·Î±×·¡¸ÓµéÀº ÀÚÁÖ deleteÇÑ pointer¸¦ NULL·Î ¼¼ÆÃÇÏ´Â °ÍÀ» Àش´Ù. ±×¸®°í ÀÌ´Â ÄÚ¾î´ýÇÁ¿Í ¿ÀÀÛµ¿À¸·Î À̾îÁú ¼ö ÀÖ´Ù. zap()Àº ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÀÚµ¿À¸·Î ó¸®ÇØÁØ´Ù. zap()¿¡ ŸÀÔ Ä³½ºÆÃÀ» ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¸¸¾à À§ zap()ÇÔ¼ö¿¡¼ ¿¡·¯°¡ ³´Ù¸é, ´Ù¸¥ µ¥¼ ½ÃÀÛµÈ ¿¡·¯ÀÏ °ÍÀÌ´Ù.
¶ÇÇÑ 9.2Àý , my_realloc() °ú my_free() ÀÌ malloc(), realloc() ±×¸®°í free() ´ë½Å ¾²¿©¾ß ÇÑ´Ù. À̵éÀº ÈξÀ ±ò²ûÇϰí, ¿©·¯°¡Áö üũµµ ÇØÁØ´Ù. ¿¹¸¦µé¾î, 9.2Àý °ú my_free() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â "String.h" ÆÄÀÏÀ» º¸¶ó.
ÁÖÀÇ : 'new'·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϱâ À§ÇØ free()¸¦ ¾²°Å³ª, malloc()À¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϱâ À§ÇØ 'delete'¸¦ ¾²Áö ¸»¾Æ¶ó. ±×·¸Áö ¾ÊÀ¸¸é °á°ú¸¦ ¿¹ÃøÇÒ ¼ö ¾ø´Â ¿¡·¯¿¡ ºüÁú °ÍÀÌ´Ù.
example_String.cpp ¿¡¼ 'Source code of C++' ¸¦ Ŭ¸¯ÇÑ´ÙÀ½, zapÇÔ¼öÀÇ ¿¹¸¦ º¸¾Æ¶ó.
malloc°ú realloc À» ÃÖ´ëÇÑ »ç¿ëÇÏÁö ¸»°í, new ¿Í 9.1Àý(delete)À» »ç¿ëÇØ¶ó. ±×·¯³ª ¶§·Î´Â C++¿¡¼ C ½ºÅ¸ÀÏÀÇ ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇØ¾ß ÇÒ Çʿ䵵 ÀÖ´Ù. ÀÌ ¶§´Â my_malloc() , my_realloc() , my_free() À» »ç¿ëÇØ¶ó. ÀÌ ÇÔ¼öµéÀº ÀûÀýÇÑ ÇÒ´ç°ú Ãʱâȸ¦ ÇØÁÖ°í, ¸Þ¸ð¸® ¹®Á¦¸¦ ¿¹¹æÇØÁØ´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼öµéÀº DEBUG¸ðµå¿¡¼ ¸Þ¸ð¸® ÇÒ´çÀ» ÃßÀûÇØÁÖ°í, ÇÁ·Î±×·¥ ½ÇÇà ÀüÈÄ¿¡ ÃÑ ¸Þ¸ð¸® »ç¿ë·®À» Ç¥½ÃÇØÁØ´Ù. ÀÌ´Â ¸Þ¸ð¸® ¸¯ÀÌ ÀÖ´ÂÁö¸¦ ¾Ë·ÁÁÙ °ÍÀÌ´Ù.
my_malloc °ú my_reallocÀº ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾú´Ù. ÀÌ´Â ¾à°£ÀÇ ¸Þ¸ð¸®¸¦ ´õ ÇÒ´çÇØ¼ (SAFE_MEM = 5) ÃʱâȽÃ۰í, ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¼ö ¾øÀ¸¸é ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 'call_check(), remove_ptr()' ÇÔ¼ö´Â DEBUG_MEM °¡ makefile¿¡¼ ((void)0) (ÀÌ´Â NULLÀ» ÀǹÌÇÑ´Ù)À¸·Î ÁöÁ¤µÇ¾îÀÖÀ» ¶§¿¡¸¸ ÀÛµ¿ÇÑ´Ù. ÀÌ´Â ÃÑ ¸Þ¸ð¸® »ç¿ë·®À» ÃßÀûÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
void *local_my_malloc(size_t size, char fname[], int lineno) { size_t tmpii = size + SAFE_MEM; void *aa = NULL; aa = (void *) malloc(tmpii); if (aa == NULL) raise_error_exit(MALLOC, VOID_TYPE, fname, lineno); memset(aa, 0, tmpii); call_check(aa, tmpii, fname, lineno); return aa; } char *local_my_realloc(char *aa, size_t size, char fname[], int lineno) { remove_ptr(aa, fname, lineno); unsigned long tmpjj = 0; if (aa) // aa != NULL tmpjj = strlen(aa); unsigned long tmpqq = size + SAFE_MEM; size_t tmpii = sizeof (char) * (tmpqq); aa = (char *) realloc(aa, tmpii); if (aa == NULL) raise_error_exit(REALLOC, CHAR_TYPE, fname, lineno); // do not memset memset(aa, 0, tmpii); aa[tmpqq-1] = 0; unsigned long kk = tmpjj; if (tmpjj > tmpqq) kk = tmpqq; for ( ; kk < tmpqq; kk++) aa[kk] = 0; call_check(aa, tmpii, fname, lineno); return aa; } |
my_malloc °ú my_free ¸¦ ¾²´Â ¿¹´Â ´ÙÀ½°ú °°´Ù.
char *aa; int *bb; float *cc; aa = (char *) my_malloc(sizeof(char)* 214); bb = (int *) my_malloc(sizeof(int) * 10); cc = (float *) my_malloc(sizeof(int) * 20); aa = my_realloc(aa, sizeof(char) * 34); bb = my_realloc(bb, sizeof(int) * 14); cc = my_realloc(cc, sizeof(float) * 10); |
C/C++¿¡¼ °¡ºñÁö ÄÝ·º¼ÇÀº Ç¥ÁØ¿¡¼ Áö¿øµÇÁö ¾Ê°í, µû¶ó¼ ¸Þ¸ð¸®¸¦ Á÷Á¢ ÇÒ´ç, ÇØÁ¦ÇÏ´Â °ÍÀÌ ¾î·Æ°í º¹ÀâÇÏ¸ç ¿¡·¯¸¦ ³»±â ½±´Ù. °¡ºñÁö ÄÝ·º¼Ç(GC:Garbage Collection) Àº ±¸ÇöÇÏ´Â ¹æ¹ýÀÌ ¿©·¯°¡Áö°¡ ÀÖ°í, °¢ ÇÁ·Î±×·¥¸¶´Ù Àû¿ëµÉ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ´Ù¸£±â ¶§¹®¿¡ C++ Ç¥ÁØÀÇ ÀϺΰ¡ µÉ ¼ö ¾ø¾ú´Ù. Àü»êÇÐÀÚµéÀº ¸¹Àº GC ¾Ë°í¸®ÁòÀ» °³¹ßÇß°í, À̵éÀº °¢ ¹®Á¦ºÐ¾ß¿¡¼¸¸ Àû¿ëµÉ ¼ö ÀÖ´Â °ÍµéÀ̾ú´Ù. Áï, ¸ðµç ÀϹÝÀûÀÎ ¹®Á¦¿¡ Àû¿ëµÉ ¼ö ÀÖ´Â ÇϳªÀÇ ¹ü¿ë GC¾Ë°í¸®ÁòÀº ¾ø´Ù. µû¶ó¼ GC´Â C++ Ç¥ÁØ¿¡ µé¾î°¡Áö ¸øÇß´Ù. µû¶ó¼ ¾ðÁ¦³ª ÇÏ´Â ÀÏ¿¡ ¸Â´Â C++ ¶óÀ̺귯¸®¸¦ ¸¹Àº ¶óÀ̺귯¸®µé Áß¿¡¼ °í¸¦ ¼ö ÀÖ´Ù.
´ÙÀ½ C++ °¡ºñÁö ÄÝ·º¼Ç(Garbage Collection) »çÀÌÆ®¿Í ¸Þ¸ð¸® °ü¸® »çÀÌÆ®¸¦ °¡º¸¾Æ¶ó.