½âÃÜCÓïÑÔÖеÄÖ¸ÕëºÍÄÚ´æÐ¹Â©
ÒýÑÔ
¶ÔÓÚÈκÎʹÓÃ?C?ÓïÑÔµÄÈË£¬Èç¹ûÎÊËûÃÇ?C?ÓïÑÔµÄ×î´ó·³ÄÕÊÇʲô£¬ÆäÖÐÐí¶àÈË¿ÉÄÜ»á»Ø´ð˵ÊÇÖ¸ÕëºÍÄÚ´æÐ¹Â©¡£ÕâЩµÄÈ·ÊÇÏûºÄÁË¿ª·¢ÈËÔ±´ó¶àÊýµ÷ÊÔʱ¼äµÄÊÂÏî¡£Ö¸ÕëºÍÄÚ´æÐ¹Â©¶ÔijЩ¿ª·¢ÈËÔ±À´ËµËƺõÁîÈËη¾å£¬µ«ÊÇÒ»µ©ÄúÁ˽âÁËÖ¸Õë¼°Æä¹ØÁªÄÚ´æ²Ù×÷µÄ»ù´¡£¬ËüÃǾÍÊÇÄúÔÚ?C?ÓïÑÔÖÐÓµÓеÄ×îÇ¿´ó¹¤¾ß¡£±¾ÎĽ«ÓëÄú·ÖÏí¿ª·¢ÈËÔ±ÔÚ¿ªÊ¼Ê¹ÓÃÖ¸ÕëÀ´±à³ÌǰӦ¸ÃÖªµÀµÄÃØÃÜ¡£±¾ÎÄÄÚÈݰüÀ¨£º
1.?µ¼ÖÂÄÚ´æÆÆ»µµÄÖ¸Õë²Ù×÷ÀàÐÍ
2.?ÔÚʹÓö¯Ì¬ÄÚ´æ·ÖÅäʱ±ØÐ뿼Âǵļì²éµã3.?µ¼ÖÂÄÚ´æÐ¹Â©µÄ³¡¾°
Èç¹ûÄúÔ¤ÏÈÖªµÀʲôµØ·½¿ÉÄܳö´í£¬ÄÇôÄú¾ÍÄܹ»Ð¡ÐıÜÃâÏÝÚ壬²¢Ïû³ý´ó¶àÊýÓëÖ¸ÕëºÍÄÚ´æÏà¹ØµÄÎÊÌâ¡£
ɶÊÇÄÚ´æÐ¹Â©
ÄÚ´æÐ¹Â¶ÔÚά»ù°Ù¿ÆÖеĽâÊÍÈçÏ£º
ÔÚ¼ÆËã»ú¿ÆÑ§ÖУ¬ÄÚ´æÐ¹Â©Ö¸ÓÉÓÚÊèºö»ò´íÎóÔì³É³ÌÐòδÄÜÊÍ·ÅÒѾ²»ÔÙʹÓõÄÄÚ´æ¡£ÄÚ´æÐ¹Â©²¢·ÇÖ¸ÄÚ´æÔÚÎïÀíÉϵÄÏûʧ£¬¶øÊÇÓ¦ÓóÌÐò·ÖÅäij¶ÎÄÚ´æºó£¬ÓÉÓÚÉè¼Æ´íÎ󣬵¼ÖÂÔÚÊͷŸöÎÄÚ´æÖ®Ç°¾ÍʧȥÁ˶ԸöÎÄÚ´æµÄ¿ØÖÆ£¬´Ó¶øÔì³ÉÁËÄÚ´æµÄÀË·Ñ¡£
ÔÚC++ÖгöÏÖÄÚ´æÐ¹Â¶µÄÖ÷ÒªÔÒò¾ÍÊdzÌÐòÔ³ÔÚÉêÇëÁËÄÚ´æºó(malloc(),?new)£¬Ã»Óм°Ê±ÊÍ·ÅûÓõÄÄÚ´æ¿Õ¼ä£¬ÉõÖÁÏûÃðÁËÖ¸Õëµ¼Ö¸ÃÇøÓòÄÚ´æ¿Õ¼ä¸ù±¾ÎÞ·¨ÊÍ·Å¡£
ÖªµÀÁ˳öÏÖÄÚ´æÐ¹Â¶µÄÔÒò¾ÍÄÜÖªµÀÈçºÎÓ¦¶ÔÄÚ´æÐ¹Â¶£¬¼´£º²»ÓÃÁ˵ÄÄÚ´æ¿Õ¼ä¼ÇµÃÊÍ·Å£¬²»ÊÍ·ÅÁô׏ýÄêÍÛ£¡ÄÚ´æÐ¹Â©¿ÉÄܻᵼÖÂÑÏÖØµÄºó¹û£º
¡ñ??³ÌÐòÔËÐкó£¬Ëæ×Åʱ¼äÕ¼ÓÃÁ˸ü¶àµÄÄڴ棬×îºóÎÞÄÚ´æ¿ÉÓöø±ÀÀ££»¡ñ??³ÌÐòÏûºÄÁË´óÁ¿µÄÄڴ棬µ¼ÖÂÆäËû³ÌÐòÎÞ·¨Õý³£Ê¹Óã»
¡ñ??³ÌÐòÏûºÄÁË´óÁ¿Äڴ棬µ¼ÖÂÏû·ÑÕßÑ¡ÓÃÁ˱ðÈ˵ijÌÐò¶ø²»ÊÇÄãµÄ£»¡ñ??¾³£×ö³öÄÚ´æÐ¹Â¶bugµÄ³ÌÐòÔ³±»¹«Ë¾¿ª³ö¶øÆ¶À§Áʵ¹¡£ÈçºÎÖªµÀ×Ô¼ºµÄ³ÌÐò´æÔÚÄÚ´æÐ¹Â¶£¿
¸ù¾ÝÄÚ´æÐ¹Â¶µÄÔÒò¼°Æä¶ñÁӵĺó¹û£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÆäÖ÷Òª±íÏÖÀ´·¢ÏÖ³ÌÐòÊÇ·ñ´æÔÚÄÚ´æÐ¹Â©£º³ÌÐò³¤Ê±¼äÔËÐкóÄÚ´æÕ¼ÓÃÂÊÒ»Ö±²»¶ÏµÄ»ºÂýµÄÉÏÉý£¬¶øÊµ¼ÊÉÏÔÚÄãµÄÂß¼Öв¢Ã»ÓÐÕâô¶àµÄÄÚ´æÐèÇó¡£ÈçºÎ¶¨Î»µ½Ð¹Â¶µãÄØ£¿
¸ù¾ÝÔÀí£¬ÎÒÃÇ¿ÉÒÔÏÈreview×Ô¼ºµÄ´úÂ룬ÀûÓÃ\delete£¬¿´¿´ÄÚ´æµÄÉêÇëÓëÊÍ·ÅÊDz»ÊdzɶÔÊͷŵģ¬ÕâʹÄãѸËÙ·¢ÏÖһЩÂß¼½ÏΪ¼òµ¥µÄÄÚ´æÐ¹Â¶Çé¿ö¡£
Èç¹ûÒÀ¾É·¢ÉúÄÚ´æÐ¹Â¶£¬¿ÉÒÔͨ¹ý¼Ç¼ÉêÇëÓëÊͷŵĶÔÏóÊýÄ¿ÊÇ·ñÒ»ÖÂÀ´Åжϡ£ÔÚÀàÖÐ×·¼ÓÒ»¸ö¾²Ì¬±äÁ¿?static?int?count;ÔÚ¹¹Ô캯ÊýÖÐÖ´ÐÐcount++;ÔÚÎö¹¹º¯ÊýÖÐÖ´ÐÐcount--;£¬Í¨¹ýÔÚ³ÌÐò½áÊøÇ°½«ËùÓÐÀàÎö¹¹£¬Ö®ºóÊä³ö¾²Ì¬±äÁ¿£¬¿´countµÄÖµÊÇ·ñΪ0£¬Èç¹ûΪ0,ÔòÎÊÌâ²¢·Ç³öÏÖÔڸô¦£¬Èç¹û²»Îª0£¬ÔòÊǸÃÀàÐͶÔÏóûÓÐÍêÈ«ÊÍ·Å¡£
¼ì²éÀàÖÐÉêÇëµÄ¿Õ¼äÊÇ·ñÍêÈ«ÊÍ·Å£¬ÓÈÆäÊÇ´æÔڼ̳и¸ÀàµÄÇé¿ö£¬¿´¿´×ÓÀàÖÐÊÇ·ñµ÷ÓÃÁ˸¸ÀàµÄÎö¹¹º¯Êý£¬ÓпÉÄÜ»áÒòΪ×ÓÀàÎö¹¹Ê±Ã»ÓÐÊÇ·ñ¸¸ÀàÖÐÉêÇëµÄÄÚ´æ¿Õ¼ä¡£
¶ÔÓÚº¯ÊýÖÐÉêÇëµÄÁÙʱ¿Õ¼ä£¬ÈÏÕæ¼ì²é£¬ÊÇ·ñ´æÔÚÌáÇ°Ìø³öº¯ÊýµÄµØ·½Ã»ÓÐÊÍ·ÅÄÚ´æ¡£
ʲôµØ·½¿ÉÄܳö´í£¿
Óм¸ÖÖÎÊÌⳡ¾°¿ÉÄÜ»á³öÏÖ£¬´Ó¶ø¿ÉÄÜÔÚÍê³ÉÉú³Éºóµ¼ÖÂÎÊÌâ¡£ÔÚ´¦ÀíÖ¸Õëʱ£¬Äú¿ÉÒÔʹÓñ¾ÎÄÖеÄÐÅÏ¢À´±ÜÃâÐí¶àÎÊÌâ¡£
δ³õʼ»¯µÄÄÚ´æ
ÔÚ±¾ÀýÖУ¬p?Òѱ»·ÖÅäÁË?10?¸ö×Ö½Ú¡£Õâ?10?¸ö×Ö½Ú¿ÉÄܰüº¬À¬»øÊý¾Ý£¬Èçͼ?1?Ëùʾ¡£
char?*p?=?malloc?(?10?);
ͼ?1.?À¬»øÊý¾Ý
Èç¹ûÔÚ¶ÔÕâ¸ö?p?¸³ÖµÇ°£¬Ä³¸ö´úÂë¶Î³¢ÊÔ·ÃÎÊËü£¬Ôò¿ÉÄÜ»á»ñµÃÀ¬»øÖµ£¬ÄúµÄ³ÌÐò¿ÉÄܾßÓв»¿ÉÔ¤²âµÄÐÐΪ¡£p?¿ÉÄܾßÓÐÄúµÄ³ÌÐò´ÓÎ´ÔøÔ¤Áϵ½µÄÖµ¡£Á¼ºÃµÄϰ¹ßÊÇʼÖÕ½áºÏʹÓÃ?memset?ºÍ?malloc·ÖÅäÄڴ棬»òÕßʹÓÃ?calloc¡£char?*p?=?malloc?(10);memset(p,¡¯\\0¡¯,10);
ÏÖÔÚ£¬¼´Ê¹Í¬Ò»¸ö´úÂë¶Î³¢ÊÔÔÚ¶Ô?p?¸³ÖµÇ°·ÃÎÊËü£¬¸Ã´úÂë¶ÎÒ²ÄÜÕýÈ·´¦Àí?Null?Öµ£¨ÔÚÀíÏëÇé¿öÏÂÓ¦¾ßÓеÄÖµ£©£¬È»ºó½«¾ßÓÐÕýÈ·µÄÐÐΪ¡£
Äڴ渲¸Ç
ÓÉÓÚ?p?Òѱ»·ÖÅäÁË?10?¸ö×Ö½Ú£¬Èç¹ûij¸ö´úÂëÆ¬¶Î³¢ÊÔÏò?p?дÈëÒ»¸ö?11?×Ö½ÚµÄÖµ£¬Ôò¸Ã²Ù×÷½«ÔÚ²»¸æËßÄúµÄÇé¿öÏÂ×Ô¶¯´ÓÆäËûij¸öλÖá°³Ôµô¡±Ò»¸ö×Ö½Ú¡£ÈÃÎÒÃǼÙÉèÖ¸Õë?q?±íʾ¸ÃÄÚ´æ¡£
ͼ?2.?Ôʼ?q?ÄÚÈÝͼ?3.?¸²¸ÇºóµÄ?q?ÄÚÈÝ
½á¹û£¬Ö¸Õë?q?½«¾ßÓдÓδԤÁϵ½µÄÄÚÈÝ¡£¼´Ê¹ÄúµÄÄ£¿é±àÂëµÃ×ã¹»ºÃ£¬Ò²¿ÉÄÜÓÉÓÚij¸ö¹²´æÄ£¿éÖ´ÐÐijЩÄÚ´æ²Ù×÷¶ø¾ßÓв»ÕýÈ·µÄÐÐΪ¡£ÏÂÃæµÄʾÀý´úÂëÆ¬¶ÎÒ²¿ÉÒÔ˵Ã÷ÕâÖÖ³¡¾°¡£
char *name = (char *) malloc(11); // Assign some value to namememcpy ( p,name,11); // Problem begins here
ÔÚ±¾ÀýÖУ¬memcpy?²Ù×÷³¢ÊÔ½«?11?¸ö×Ö½Úдµ½?p£¬¶øºóÕß½ö±»·ÖÅäÁË?10?¸ö×Ö½Ú¡£
×÷ΪÁ¼ºÃµÄʵ¼ù£¬Ã¿µ±ÏòÖ¸ÕëдÈëֵʱ£¬¶¼ÒªÈ·±£¶Ô¿ÉÓÃ×Ö½ÚÊýºÍËùдÈëµÄ×Ö½ÚÊý½øÐн»²æºË¶Ô¡£Ò»°ãÇé¿öÏ£¬memcpy?º¯Êý½«ÊÇÓÃÓÚ´ËÄ¿µÄµÄ¼ì²éµã¡£
ÄÚ´æ¶ÁȡԽ½ç
ÄÚ´æ¶ÁȡԽ½ç?(overread)?ÊÇÖ¸Ëù¶ÁÈ¡µÄ×Ö½ÚÊý¶àÓÚËüÃÇÓ¦ÓеÄ×Ö½ÚÊý¡£Õâ¸öÎÊÌâ²¢²»Ì«ÑÏÖØ£¬Ôڴ˾Ͳ»ÔÙÏêÊöÁË¡£ÏÂÃæµÄ´úÂëÌṩÁËÒ»¸öʾÀý¡£
char *ptr = (char *)malloc(10);char name[20] ;memcpy ( name,ptr,20); // Problem begins here
ÔÚ±¾ÀýÖУ¬memcpy?²Ù×÷³¢ÊÔ´Ó?ptr?¶ÁÈ¡?20?¸ö×Ö½Ú£¬µ«ÊǺóÕß½ö±»·ÖÅäÁË?10?¸ö×Ö½Ú¡£Õ⻹»áµ¼Ö²»Ï£ÍûµÄÊä³ö¡£
ÄÚ´æÐ¹Â©
ÄÚ´æÐ¹Â©¿ÉÄÜÕæÕýÁîÈËÌÖÑá¡£ÏÂÃæµÄÁбíÃèÊöÁËһЩµ¼ÖÂÄÚ´æÐ¹Â©µÄ³¡¾°¡£ÖØÐ¸³Öµ
ÎÒ½«Ê¹ÓÃÒ»¸öʾÀýÀ´ËµÃ÷ÖØÐ¸³ÖµÎÊÌâ¡£
char *memoryArea = malloc(10);char *newArea = malloc(10);
ÕâÏòÈçÏÂÃæµÄͼ?4?ËùʾµÄÄÚ´æÎ»Öø³Öµ¡£
ͼ?4.?ÄÚ´æÎ»ÖÃ
memoryArea?ºÍ?newArea?·Ö±ð±»·ÖÅäÁË?10?¸ö×Ö½Ú£¬ËüÃǸ÷×ÔµÄÄÚÈÝÈçͼ?4?Ëùʾ¡£Èç¹ûijÈËÖ´ÐÐÈçÏÂËùʾµÄÓï¾ä£¨Ö¸ÕëÖØÐ¸³Öµ£©¡¡
memoryArea = newArea;
ÔòËü¿Ï¶¨»áÔÚ¸ÃÄ£¿é¿ª·¢µÄºóÐø½×¶Î¸øÄú´øÀ´Âé·³¡£
ÔÚÉÏÃæµÄ´úÂëÓï¾äÖУ¬¿ª·¢ÈËÔ±½«?memoryArea?Ö¸Õ븳ֵ¸ø?newArea?Ö¸Õë¡£½á¹û£¬memoryArea?ÒÔǰËùÖ¸ÏòµÄÄÚ´æÎ»Öñä³ÉÁ˹ÂÁ¢µÄ£¬ÈçÏÂÃæµÄͼ?5?Ëùʾ¡£ËüÎÞ·¨ÊÍ·Å£¬ÒòΪûÓÐÖ¸Ïò¸ÃλÖõÄÒýÓá£Õâ»áµ¼ÖÂ?10?¸ö×Ö½ÚµÄÄÚ´æÐ¹Â©¡£
ͼ?5.?ÄÚ´æÐ¹Â©
ÔÚ¶ÔÖ¸Õ븳ֵǰ£¬ÇëÈ·±£ÄÚ´æÎ»Öò»»á±äΪ¹ÂÁ¢µÄ¡£Ê×ÏÈÊͷŸ¸¿é
¼ÙÉèÓÐÒ»¸öÖ¸Õë?memoryArea£¬ËüÖ¸ÏòÒ»¸ö?10?×Ö½ÚµÄÄÚ´æÎ»Ö᣸ÃÄÚ´æÎ»ÖõĵÚÈý¸ö×Ö½ÚÓÖÖ¸Ïòij¸ö¶¯Ì¬·ÖÅäµÄ?10?×Ö½ÚµÄÄÚ´æÎ»Öã¬Èçͼ?6?Ëùʾ¡£
ͼ?6.?¶¯Ì¬·ÖÅäµÄÄÚ´æ
free(memoryArea)
Èç¹ûͨ¹ýµ÷ÓÃ?free?À´ÊÍ·ÅÁË?memoryArea£¬Ôò?newArea?Ö¸ÕëÒ²»áÒò´Ë¶ø±äµÃÎÞЧ¡£newArea?ÒÔǰËùÖ¸ÏòµÄÄÚ´æÎ»ÖÃÎÞ·¨ÊÍ·Å£¬ÒòΪÒѾûÓÐÖ¸Ïò¸ÃλÖõÄÖ¸Õë¡£»»¾ä»°Ëµ£¬newArea?ËùÖ¸ÏòµÄÄÚ´æÎ»ÖñäΪÁ˹ÂÁ¢µÄ£¬´Ó¶øµ¼ÖÂÁËÄÚ´æÐ¹Â©¡£
ÿµ±ÊͷŽṹ»¯µÄÔªËØ£¬¶ø¸ÃÔªËØÓÖ°üº¬Ö¸Ïò¶¯Ì¬·ÖÅäµÄÄÚ´æÎ»ÖõÄÖ¸Õëʱ£¬Ó¦Ê×ÏȱéÀú×ÓÄÚ´æÎ»Öã¨ÔÚ´ËÀýÖÐΪ?newArea£©£¬²¢´ÓÄÇÀ↑ʼÊÍ·Å£¬È»ºóÔÙ±éÀú»Ø¸¸½Úµã¡£
ÕâÀïµÄÕýȷʵÏÖÓ¦¸ÃΪ£º
free( memoryArea->newArea);free(memoryArea);
·µ»ØÖµµÄ²»ÕýÈ·´¦Àí
ÓÐʱ£¬Ä³Ð©º¯Êý»á·µ»Ø¶Ô¶¯Ì¬·ÖÅäµÄÄÚ´æµÄÒýÓ᣸ú×Ù¸ÃÄÚ´æÎ»Öò¢ÕýÈ·µØ´¦ÀíËü¾Í³ÉΪÁË?calling?º¯ÊýµÄÖ°Ôð¡£
char *func ( ){ ? ? ? ?return malloc(20); // make sure to memset this location to ¡®\\0¡¯¡}
void callingFunc ( ){ ? ? ? ?func ( ); // Problem lies here}
ÔÚÉÏÃæµÄʾÀýÖУ¬callingFunc()?º¯ÊýÖжÔ?func()?º¯ÊýµÄµ÷ÓÃδ´¦Àí¸ÃÄÚ´æÎ»Öõķµ»ØµØÖ·¡£½á¹û£¬func()?º¯ÊýËù·ÖÅäµÄ?20?¸ö×ֽڵĿé¾Í¶ªÊ§ÁË£¬²¢µ¼ÖÂÁËÄÚ´æÐ¹Â©¡£
¹é»¹ÄúËù»ñµÃµÄ
ÔÚ¿ª·¢×é¼þʱ£¬¿ÉÄÜ´æÔÚ´óÁ¿µÄ¶¯Ì¬ÄÚ´æ·ÖÅä¡£Äú¿ÉÄÜ»áÍüÁ˸ú×ÙËùÓÐÖ¸Õ루ָÏòÕâЩÄÚ´æÎ»Öã©£¬²¢ÇÒijЩÄÚ´æ¶ÎûÓÐÊÍ·Å£¬»¹±£³Ö·ÖÅ䏸¸Ã³ÌÐò¡£
ʼÖÕÒª¸ú×ÙËùÓÐÄÚ´æ·ÖÅ䣬²¢ÔÚÈκÎÊʵ±µÄʱºòÊÍ·ÅËüÃÇ¡£ÊÂʵÉÏ£¬¿ÉÒÔ¿ª·¢Ä³ÖÖ»úÖÆÀ´¸ú×ÙÕâЩ·ÖÅ䣬±ÈÈçÔÚÁ´±í½Úµã±¾ÉíÖб£ÁôÒ»¸ö¼ÆÊýÆ÷£¨µ«Äú»¹±ØÐ뿼ÂǸûúÖÆµÄ¶îÍ⿪Ïú£©¡£
·ÃÎÊ¿ÕÖ¸Õë
·ÃÎÊ¿ÕÖ¸ÕëÊǷdz£Î£Ïյģ¬ÒòΪËü¿ÉÄÜʹÄúµÄ³ÌÐò±ÀÀ£¡£Ê¼ÖÕҪȷ±£Äú²»ÊÇ?ÔÚ·ÃÎÊ¿ÕÖ¸Õë¡£
ûÓжã¹ýµÄ¿Ó--Ö¸Õ루ÄÚ´æÐ¹Â¶£©C++±»ÈËÂîÄï×î¶àµÄ¾ÍÊÇÖ¸Õë¡£
Ò¹ÉîÈ˾²µÄʱºò£¬Äóö¼¸¸öʹÓÃÖ¸ÕëÈÝÒ׳öÏֵĿӶù¡£¿ÉÄÜÎÒµÄÓïÑÔÃèÊöÓÐЩÈÃÈ˷Ѿ¢£¬¾¡Á¿ÓôúÂë˵»°¡£
ͨ¹ýÖ¸ÏòÀàµÄNULLÖ¸Õëµ÷ÓÃÀàµÄ³ÉÔ±º¯Êý
ÊÔͼÓÃÒ»¸önullÖ¸Õëµ÷ÓÃÀàµÄ³ÉÔ±º¯Êý£¬µ¼Ö±ÀÀ££º
#include
Ϊʲô»áÕâÑù£¿?
ͨ¹ý·Ç·¨Ö¸Õëµ÷Óú¯Êý£¬¾ÍÏ൱ÓÚ¸øº¯Êý´«µÝÁËÒ»¸öÖ¸Ïòº¯ÊýµÄ·Ç·¨Ö¸Õ룡?
µ«ÊÇΪʲôpA2->dumb()»á³É¹¦ÄØ£¿?ÒòΪµ¼Ö±ÀÀ£µÄÊÇ·ÃÎÊÁ˳ÉÔ±±äÁ¿£¡£¡Ê¹ÓÃÒѾÊͷŵÄÖ¸Õë
struct X{int data;};int foo(){struct X *pX;pX = (struct X *) malloc(sizeof (struct X));pX->data = 10;free(pX);...return pX->data;}
ʹÓÃδ³õʼ»¯µÄÖ¸Õë
Èç¹ûÄãÕâÑùд£¬±àÒëÆ÷»áÌáʾÄãʹÓÃÁËδ³õʼ»¯µÄ±äÁ¿p¡£
void fooA(){int *p;*p = 100;}
ÄÇôÈç¹ûÎÒÊÍ·ÅÒ»¸ö³õʼ»¯µÄÖ¸ÕëÄØ£¿
void fooB(){int *p;free(p);}
½á¹ûÊÇÒ»ÑùµÄ£¡£¡ÊÍ·ÅÒѾÊͷŵÄÖ¸ÕëÖ±½Ó¿´¿´´úÂ룺
void fooA(){char *p;p = (char *)malloc(100);cout << \\
ÕâÑùµÄÎÊÌâÒ²Ðí²»»áÁ¢¼´Ê¹ÄãµÄ³ÌÐò±ÀÀ££¬ÄÇÑùºó¹û¸ü¼ÓÑÏÖØ£¡£¡Ã»Óе÷ÓÃ×ÓÀàµÄÎö¹¹º¯Êý
֮ǰµÄ²©¿Í½²¹ý£¬¸¸ÀàµÄÎö¹¹º¯Êý×îºÃÉùÃ÷ΪÐ飡£¡
ParentClass *pObj = new ChildClass;...delete pObj;
ÉÏÊö´úÂë»áÔì³É±ÀÀ££¬Èç¹û¸¸ÀàµÄÎö¹¹º¯Êý²»ÉùÃ÷ΪÐ飬ÄÇô²»»áµ÷Óü̳ÐÀàµÄÎö¹¹º¯Êý£¬Ôì³ÉÄÚ´æÐ¹Â¶¡£ÄÚ´æÒç³ö
µ±ÎÒÃÇ¿½±´×Ö·û´®µÄʱºò£¬ÎÒÃdz£³£»áÓõ½?memcpyº¯Êý¡£ÕâÀïÌØ±ðÐèҪעÒâµÄ¾ÍÊÇ×Ö·û´®½áβµÄnull×Ö·û£º
char *p = (char *)malloc(strlen(str));strcpy(p, str);
ΪÁ˶ã¹ýÕâ¸ö¿Ó£¬Ö»ÐèÒª°Ñ?strlen(str)?¸ÄΪ?strlen(str)+1¡£¼ÇÒ»´ÎÖ¸ÕëʹÓò»µ±Ôì³ÉµÄÄÚ´æÐ¹Â¶
¸ÕдÍêÒ»¶Î´úÂ룬ÓÉÓÚ½«ºÜÔËÐÐÔÚÒÆ¶¯É豸ÉÏ£¬?ÎÒ¾ö¶¨ÏȲâÊÔÒ»ÏÂÄÚ´æµÄʹÓÃÁ¿£¬?½á¹û·¢ÏÖÁ˺ÜÑÏÖØµÄÄÚ´æÐ¹Â©£¬?ÔÚǰǰºóºó·¿´ÁËnew?ºÍdelete²¢È·ÈÏûÓЩдµÄÇé¿öÏ£¬?й¶ÒÀÈ»´æÔÚ£¡µ÷ÊÔºó×îÖÕÈ·ÈÏÁËÎÊÌâÊÇÒòΪunionµÄ²»µ±Ê¹ÓÃÔì³ÉµÄ£¬?ÏÂÃæ¿ªÊ¼»¹ÔÏÖ³¡£º
typedef struct DATA_{ ? ?DATA_(int size = 10) ? ?{ ? ? ? ?pVoid = new char[nSize];this->size = size; ? ?}virtual ~DATA_() ? ?{if (pVoid) ? ? ? ?{delete pVoid; ? ? ? ?} ? ?}int nSize;void *pVoid;}DATA, *LPDATA;
struct STRUCT1{ ? ?STRUCT1(int count) ? ?{ ? ? ? ?pVoid = new DATA[count];this->count = count; ? ?}virtual ~STRUCT1() ? ?{if (pVoid) ? ? ? ?{delete pVoid; ? ? ? ?} ? ?}int count;union ? ?{void *pVoid; ? ? ? ?LPDATA pData; ? ?}}
int main(int argc, char* argv[]){for( int i = 0; i < 1000; i++) ? ?{void *p = new STRUCT1( 10 );delete p; ? ?}return 0;}
ÔÚÉÏÃæÕâ¶Î´úÂëÖУ¬STRUCT1Öаüº¬ÁËÈô¸É¸öDATA½á¹¹£¬DATA½á¹¹ÓÖÉêÇëÁËĬÈÏΪ10byte´óСµÄÄڴ棬²¢ÇÒÄÚ´æÔÚ¶ÔÏóÎö¹¹µÄʱºò»áÓÃdelete»ØÊÕ¡£Õ§Ò»¿´Õâ¸ö´úÂëÃ²ËÆ²»»áй¶Äڴ棬Æäʵ²»È»£¬´ýÎÒ·ÖÎö£º
ÔÚC++Öй¹Ô캯ÊýÓëÎö¹¹º¯ÊýµÄµ÷ÓÃÊÇÓɱàÒëÆ÷Íê³ÉµÄ£¬ÆäÖй¹Ô캯ÊýµÄµ÷ÓÃÒ»°ãÊÇÔÚ¶ÔÏó¿Õ¼ä¿ª±ÙÍêÒÔºó£¨Õ»¶ÔÏó»òÕ߶ѶÔÏó¶¼ÊÇÒ»ÑùµÄ£©£¬½«²ÎÊýѹջ£¬thisÖ¸Õ루¶ÔÏóµÄÆðʼµØÖ·£©·ÅÈëeax¼Ä´æÆ÷£¨²»Í¬µÄ±àÒëÆ÷×ö·¨¿ÉÄܲ»Í¬£©£¬È»ºóÌøµ½¹¹Ô캯ÊýÈ¥Ö´ÐС£¶øÎö¹¹º¯ÊýµÄµ÷ÓÃÔòÊǵ±¶ÔÏóÄÚ´æ±»»ØÊÕµÄʱºò±»µ÷
Óã¨Õ»¶ÔÏóÊǵ±´úÂëÖ´Ðе½±äÁ¿¿É¼ûÓòÍâ֮ǰµ÷Óã¬?¶Ñ¶ÔÏóÊÇÔÚdeleteÓï¾äµÄλÖýøÐе÷Óã©¡£
È»¶ø±àÒëÆ÷²¢ÊÇÄÇôÖÇÄܵĿÉÒÔÀí½âcoderµÄÒâͼ£¬Îö¹¹º¯ÊýµÄµ÷ÓÃÊǸù¾Ýµ±Ç°deleteµÄÖ¸ÕëÀàÐÍÀ´È·¶¨µÄ£¬¶ø£¨ÏÂÃæ£©Õâ¶Î´úÂëȴûÓÐÌṩÀàÐÍ£¬?Õâµ¼ÖÂÁËDATA_µÄÎö¹¹º¯Êý½«²»»á±»µ÷Óã¬ÄÚ´æÐ¹Â©¾ÍÔÚËùÄÑÃâÁË¡£
virtual ~STRUCT1() ? ?{if (pVoid) ? {delete pVoid;//ÎÊÌâÔÚÕâ, Ó¦¸ÃʹÓÃdelete pData; ? ? ? ?} ? ?}
×ܽá
±¾ÎÄÌÖÂÛÁ˼¸ÖÖÔÚʹÓö¯Ì¬ÄÚ´æ·ÖÅäʱӦ¸Ã±ÜÃâµÄÏÝÚå¡£Òª±ÜÃâÄÚ´æÏà¹ØµÄÎÊÌ⣬Á¼ºÃµÄϰ¹ßÊÇ£º
1.??ʼÖÕ½áºÏʹÓÃ?memset?ºÍ?malloc·ÖÅäÄڴ棬»òʼÖÕʹÓÃ?calloc¡£
2.??ÿµ±ÏòÖ¸ÕëдÈëֵʱ£¬¶¼ÒªÈ·±£¶Ô¿ÉÓÃ×Ö½ÚÊýºÍËùдÈëµÄ×Ö½ÚÊý½øÐн»²æºË¶Ô¡£
3.??ÔÚ¶ÔÖ¸Õ븳ֵǰ£¬ÒªÈ·±£Ã»ÓÐÄÚ´æÎ»Öûá±äΪ¹ÂÁ¢µÄ¡£
4.??ÿµ±ÊͷŽṹ»¯µÄÔªËØ£¨¶ø¸ÃÔªËØÓÖ°üº¬Ö¸Ïò¶¯Ì¬·ÖÅäµÄÄÚ´æÎ»ÖõÄÖ¸Õ룩ʱ£¬¶¼Ó¦Ê×ÏȱéÀú×ÓÄÚ´æÎ»Öò¢´ÓÄÇÀ↑ʼÊÍ·Å£¬È»ºóÔÙ±éÀú»Ø¸¸½Úµã¡£5.?ʼÖÕÕýÈ·´¦Àí·µ»Ø¶¯Ì¬·ÖÅäµÄÄÚ´æÒýÓõĺ¯Êý·µ»ØÖµ¡£6.?ÿ¸ö?malloc?¶¼ÒªÓÐÒ»¸ö¶ÔÓ¦µÄ?free¡£7.?È·±£Äú²»ÊÇÔÚ·ÃÎÊ¿ÕÖ¸Õë¡£
Ïà¹ØÍÆ¼ö£º