ÀÖÓãµç¾º

½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

LinuxϵͳÏÂÈçºÎ¼ì²âÄÚ´æÐ¹Â¶£¿[CÓïÑÔÅàѵ]

¸üÐÂʱ¼ä:2020Äê01ÔÂ16ÈÕ14ʱ32·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:

01. ǰÑÔ

C/C++ÔËÐиßЧ£¬²»¹ÜÊDzÙ×÷ϵͳÄں˻¹ÊǶÔÐÔÓÐÒªÇóµÄ³ÌÐò£¨±ÈÈçÓÎÏ·ÒýÇæ£©¶¼ÒªÇóʹÓÃC/C++À´±àд£¬ÆäʵC/C++Ç¿´óµÄÒ»µãÔÚÓÚÄܹ»Ê¹ÓÃÖ¸Õë×ÔÓɵؿØÖÆÄÚ´æµÄʹÓã¬ÊÊʱµÄÉêÇëÄÚ´æºÍÊÍ·ÅÄڴ棬´Ó¶ø×öµ½ÆäËû±à³ÌÓïÑÔ×ö²»µ½µÄ¸ßЧµØÔËÐС£µ«ÊÇÄÚ´æ¹ÜÀíÊÇÒ»°ÑË«Èн££¬ÓúÃÁËÏ÷ÌúÈçÄ࣬Óò»ºÃ×Ô¶ÏÒ»±Û¡£ÔÚÉêÇë¶ÑÉÏÄÚ´æÊ¹ÓÃÍêÖ®ºóÖÐÈç¹û×ö²»µ½ÊÊʱÓÐЧµÄÊÍ·Å£¬ÄÇô¾Í»áÔì³ÉÄÚ´æÐ¹Â¶£¬¾Ã¶ø¾ÃÖ®³ÌÐò¾Í»á½«ÏµÍ³ÄÚ´æºÄ¾¡£¬µ¼ÖÂϵͳÔËÐгöÎÊÌâ¡£¾ÍÈçͬÄãÿÌìÅÜȥͼÊé¹Ý½èÒ»´òÊé¼®¶ø²»»¹£¬Ö±µ½Í¼Êé¹Ýµ¹±ÕΪֹ¡£

CÓïÑÔÖÐÉêÇëÄÚ´æºÍÊÍ·ÅÄÚ´æµÄ·½·¨ÊÇʹÓà mallocºÍfree¡£

C++ÖÐÄܼæÈÝC£¬ËùÒÔÒ²ÄÜʹÓÃmallocºÍfree£¬ÃæÏò¶ÔÏóµÄÇé¿öÏÂʹÓõÄÔòÊÇnewºÍdelete£¬Äܹ»×Ô¶¯Ö´Ðй¹Ô캯ÊýºÍÎö¹¹º¯Êý¡£

ÔÚLinuxƽ̨£¬ÎÒÃÇ¿ÉÒÔʹÓÃvalgrindÃüÁî¼ì²âC/C++³ÌÐòÊÇ·ñÄÚ´æÐ¹Â¶¡£

02. valgrind°²×°

debian/ubuntuϰ²×°·½·¨£º

 deng@itcast:~$ sudo apt install valgrind
 deng@itcast:~$ sudo yum install valgrind


°²×°ºÃvalgrind¹¤¾ßÖ®ºó£¬ÏÂÃæÀ´¿´¿´valgrindµÄ¼¸¸öÓ¦Óó¡¾°¡£

redhat/centosϰ²×°·½·¨£º

03. ʹÓÃδ³õʼ»¯µÄÄÚ´æ

³ÌÐòÖÐÎÒÃǶ¨ÒåÁËÒ»¸öÖ¸Õëp£¬µ«²¢Î´¸øËû·ÖÅä¿Õ¼ä£¬µ«ÎÒÃÇȴʹÓÃËüÁË¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     char ch;
     char *p;
 
     ch = *p;
 
     printf("ch = %c\n", ch);
 
     return 0;
 }

valgrind¼ì²â³öµ½ÎÒÃǵijÌÐòʹÓÃÁËδ³õʼ»¯µÄ±äÁ¿¡£

1579143350462_C++ÄÚ´æÐ¹Â¶01.jpg


04. ʹÓÃÒ°Ö¸Õë

pËùÖ¸ÏòµÄÄÚ´æ±»ÊÍ·ÅÁË£¬p±ä³ÉÁËÒ°Ö¸Õ룬µ«ÊÇÎÒÃÇÈ´¼ÌÐøÊ¹ÓÃÕâÆ¬ÄÚ´æ¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     int *p = NULL;
 
     p = malloc(sizeof(int));
     if (NULL == p)
    {  
         printf("malloc failed...\n");
         return 1;
    }  
     memset(p, 0, sizeof(int));
 
     *p = 88;
 
     printf("*p = %d\n", *p);
 
     //ÊÍ·ÅÄÚ´æ
     free(p);
 
     printf("*p = %d\n", *p);
 
     return 0;
 }

valgrind¼ì²âµ½ÎÒÃÇʹÓÃÁËÒѾ­freeµÄÄڴ棬²¢¸ø³öÕâÆ¬ÄÚ´æÊÇÄÄÀï·ÖÅäºÍÄÄÀïÊͷŵÄ¡£

1579143360325_C++ÄÚ´æÐ¹Â¶02.jpg


05. ¶¯Ì¬ÄÚ´æÔ½½ç·ÃÎÊ

ÎÒÃǶ¯Ì¬µØ·ÖÅäÁËһƬÁ¬ÐøµÄ´æ´¢¿Õ¼ä£¬µ«ÎÒÃÇÔÚ·ÃÎʸöÊý×éʱ·¢ÉúÁËÔ½½ç·ÃÎÊ¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     int i = 0;
     int *p = NULL;
 
     p = malloc(5 * sizeof(int));
     if (NULL == p)
    {  
         printf("malloc failed...\n");
         return 1;
    }  
     memset(p, 0, 10 * sizeof(int));
 
     for (int i = 0; i <= 5; i++)
    {  
         p[i] = i + 1;  
    }  
 
     for (int i = 0; i <= 5; i++)
    {  
         printf("p[%d]: %d\n", i, p[i]);
    }  
 
     return 0;
 }

valgrind¼ì²â³öÔ½½çÐÅÏ¢ÈçÏ¡£

1579143369216_C++ÄÚ´æÐ¹Â¶03.jpg


×¢Ò⣺

valgrind²»¼ì²é·Ç¶¯Ì¬·ÖÅäÊý×éµÄʹÓÃÇé¿ö¡£

06. ·ÖÅä¿Õ¼äºóûÓÐÊÍ·Å

ÄÚ´æÐ¹Â©µÄÔ­ÒòÔÚÓÚÎÒÃÇʹÓÃfree»òÕßnew·ÖÅä¿Õ¼äÖ®ºó£¬Ã»ÓÐʹÓÃfree»òÕßdeleteÊÍ·ÅÄÚ´æ¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     int *p = NULL;
 
     p = malloc(sizeof(int));
         
     *p = 88;
 
     printf("*p = %d\n", *p);
 
     return 0;
 }

valgrindµÄ¼Ç¼ÏÔʾÉÏÃæµÄ³ÌÐòÓÃÁË1´Îmalloc£¬È´µ÷ÓÃÁË0´Îfree¡£

1579143379144_C++ÄÚ´æÐ¹Â¶04.jpg

¿ÉÒÔʹÓÃ--leak-check=full½øÒ»²½»ñÈ¡ÄÚ´æÐ¹Â©µÄÐÅÏ¢£¬±ÈÈçmalloc¾ßÌåÐкš£

1579143388901_C++ÄÚ´æÐ¹Â¶05.jpg


07. ²»Æ¥ÅäʹÓÃdelete»òÕßfree

Ò»°ãÎÒÃÇʹÓÃmalloc·ÖÅäµÄ¿Õ¼ä£¬±ØÐëʹÓÃfreeÊÍ·ÅÄڴ档ʹÓÃnew·ÖÅäµÄ¿Õ¼ä£¬Ê¹ÓÃdeleteÊÍ·ÅÄÚ´æ¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     int *p = NULL;
 
     p = (int *)malloc(sizeof(int));
     
     *p = 88;
 
     printf("*p = %d\n", *p);
 
     delete p;
 
     return 0;
 }

²»Æ¥ÅäµØÊ¹ÓÃmalloc/new/new[] ºÍ free/delete/delete[]Ôò»á±»Ìáʾmismacth

1579143403216_C++ÄÚ´æÐ¹Â¶06.jpg


08. Á½´ÎÊÍ·Åͬһ¿éÄÚ´æ

Ò»°ãÇé¿öÏ£¬ÄÚ´æ·ÖÅäÒ»´Î£¬Ö»ÊÍ·ÅÒ»´Î¡£Èç¹û¶à´ÎÊÍ·Å£¬¿ÉÄÜ»á³öÏÖdouble free¡£

³ÌÐòʾÀý:

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 int main(void)
 {
     int *p = NULL;
 
     p = (int *)malloc(sizeof(int));
     
     *p = 88;
 
     printf("*p = %d\n", *p);
 
     free p;
  free p;
     
     return 0;
 }

¶à´ÎÊÍ·ÅͬһÄڴ棬³öÏÖ·Ç·¨ÊÍ·ÅÄÚ´æ¡£

1579143411187_C++ÄÚ´æÐ¹Â¶07.jpg


09. ×ܽá

ÄÚ´æÐ¹Â¶ÎÊÌâ·Ç³£ÄѶ¨Î»£¬¶ÔÓÚС¹¤³ÌÏîÄ¿À´Ëµ£¬¼òµ¥È¥¼ì²é´úÂëÖÐnewºÍdeleteµÄÆ¥Åä¶ÔÊý¾Í»ù±¾Äܶ¨Î»µ½ÎÊÌ⣬µ«ÊÇÒ»µ©´úÂëÁ¿ÉÏÉýµ½ÒÔÍòµ¥Î»Ê±£¬½ö¿¿ÈâÑÛ¼ì²éÀ´¶¨Î»ÎÊÌâÄǾͷdz£À§ÄÑÁË£¬ËùÒÔÎÒÃÇÐèÒªÀûÓù¤¾ß°ïÖúÎÒÃÇÕÒ³öÎÊÌâËùÔÚ¡£ÔÚLinuxϵͳÏÂÄÚ´æ¼ì²â¹¤¾ßÊ×ÍÆValgrind£¬Ò»¿î·Ç³£ºÃÓõĿªÔ´ÄÚ´æ¹ÜÀí¹¤¾ß¡£ValgrindÆäʵÊÇÒ»¸ö¹¤¾ß¼¯£¬ÄÚ´æ´íÎó¼ì²âÖ»ÊÇËüÖڶ๦ÄܵÄÒ»¸ö£¬µ«ÎÒÃÇÓõÃ×î¶àµÄ¹¦ÄÜÕýÊÇËü——memcheck¡£ÍƼöÁ˽âÀÖÓã²¥¿ÍC++Åàѵ¿Î³Ì¡£

×ÜÖ®£¬valgrind¹¤¾ß¿ÉÒÔ¼ì²âÏÂÁÐÓëÄÚ´æÏà¹ØµÄÎÊÌâ :

· δÊÍ·ÅÄÚ´æµÄʹÓÃ

· ¶ÔÊͷźóÄÚ´æµÄ¶Á/д

· ¶ÔÒÑ·ÖÅäÄÚ´æ¿éβ²¿µÄ¶Á/д

· ÄÚ´æÐ¹Â¶

· ²»Æ¥ÅäµÄʹÓÃmalloc/new/new[] ºÍ free/delete/delete[]

· ÖØ¸´ÊÍ·ÅÄÚ´æ

²ÂÄãϲ»¶£º
C/C++£º³õѧÕß³£Óöµ½µÄcÓïÑÔÏÝÚå

0 ·ÖÏíµ½£º
ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿