• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            把握命運,追逐夢想

            對自己所做的事要有興趣,同時還要能夠堅持不懈

            統計

            留言簿(1)

            閱讀排行榜

            評論排行榜

            vc上的內存泄露調試的例子

            /*****************************************************************
             *             ?000 Microsoft Corporation                  *
             *  CRT_DBG1                                                     *
             *  This simple program illustrates the basic debugging features *
             *  of the C runtime libraries, and the kind of debug output     *
             *  that these features generate.                                *
             ****************************************************************
            */


            #include 
            <stdio.h>
            #include 
            <string.h>
            #include 
            <malloc.h>
            #include 
            <crtdbg.h>
                
            // Disable deprecation warnings.  The unsecure version of strcpy is
            // used intentionally to show off debugging features.
            #pragma warning (disable : 4996)

            // This routine place comments at the head of a section of debug output
            void OutputHeading( const char * explanation )
            {
               _RPT1( _CRT_WARN, 
            "\n\n%s:\n**************************************\
            ************************************\n", explanation );
            }


            // The following macros set and clear, respectively, given bits
            // of the C runtime library debug flag, as specified by a bitmask.
            #ifdef   _DEBUG
            #define  SET_CRT_DEBUG_FIELD(a) \
                        _CrtSetDbgFlag((a) 
            | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
            #define  CLEAR_CRT_DEBUG_FIELD(a) \
                        _CrtSetDbgFlag(
            ~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
            #else
            #define  SET_CRT_DEBUG_FIELD(a)   ((void) 0)
            #define  CLEAR_CRT_DEBUG_FIELD(a) ((void) 0)
            #endif


            int main( )
            {
               
            char *p1, *p2;
               _CrtMemState s1, s2, s3;

            #ifndef _DEBUG
            printf(
            "Skipping this for non-debug mode.\n");
            return 2;
            #endif

               
            // Send all reports to STDOUT
               _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
               _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
               _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
               _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
               _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
               _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );

               
            // Allocate 2 memory blocks and store a string in each
               p1 = malloc( 34 );
               strcpy( p1, 
            "This is the p1 string (34 bytes)." );

               p2 
            = malloc( 34 );
               strcpy( p2, 
            "This is the p2 string (34 bytes)." );


               OutputHeading( 
                  
            "Use _ASSERTE to check that the two strings are identical" );
               _ASSERTE( strcmp( p1, p2 ) 
            == 0 );

               OutputHeading( 
                  
            "Use a _RPT macro to report the string contents as a warning" );
               _RPT2( _CRT_WARN, 
            "p1 points to '%s' and \np2 points to '%s'\n", p1, p2 );

               OutputHeading( 
                  
            "Use _CRTMemDumpAllObjectsSince to check the p1 and p2 allocations" );
               _CrtMemDumpAllObjectsSince( NULL );

               free( p2 );

               OutputHeading( 
                  
            "Having freed p2, dump allocation information about p1 only" );
               _CrtMemDumpAllObjectsSince( NULL );

               
            // Store a memory checkpoint in the s1 memory-state structure
               _CrtMemCheckpoint( &s1 );

               
            // Allocate another block, pointed to by p2
               p2 = malloc( 38 );
               strcpy( p2, 
            "This new p2 string occupies 38 bytes.");

               
            // Store a 2nd memory checkpoint in s2
               _CrtMemCheckpoint( &s2 );

               OutputHeading( 
                  
            "Dump the changes that occurred between two memory checkpoints" );
               
            if ( _CrtMemDifference( &s3, &s1, &s2 ) )
                  _CrtMemDumpStatistics( 
            &s3 );

               
            // Free p2 again and store a new memory checkpoint in s2
               free( p2 );
               _CrtMemCheckpoint( 
            &s2 );

               OutputHeading( 
                  
            "Now the memory state at the two checkpoints is the same" );
               
            if ( _CrtMemDifference( &s3, &s1, &s2 ) )
                  _CrtMemDumpStatistics( 
            &s3 );

               strcpy( p1, 
            "This new p1 string is over 34 bytes" );
               OutputHeading( 
            "Free p1 after overwriting the end of the allocation" );
               free( p1 );

               
            // Set the debug-heap flag so that freed blocks are kept on the
               
            // linked list, to catch any inadvertent use of freed memory
               SET_CRT_DEBUG_FIELD( _CRTDBG_DELAY_FREE_MEM_DF );

               p1 
            = malloc( 10 );
               free( p1 );
               strcpy( p1, 
            "Oops" );

               OutputHeading( 
            "Perform a memory check after corrupting freed memory" );
               _CrtCheckMemory( );

               
            // Use explicit calls to _malloc_dbg to save file name and line number
               
            // information, and also to allocate Client type blocks for tracking
               p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );
               p2 
            = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );
               strcpy( p1, 
            "p1 points to a Normal allocation block" );
               strcpy( p2, 
            "p2 points to a Client allocation block" );

               
            // You must use _free_dbg to free a Client block
               OutputHeading( 
                  
            "Using free( ) to free a Client block causes an assertion failure" );
               free( p1 );
               free( p2 );

               p1 
            = malloc( 10 );
               OutputHeading( 
            "Examine outstanding allocations (dump memory leaks)" );
               _CrtDumpMemoryLeaks( );

               
            // Set the debug-heap flag so that memory leaks are reported when
               
            // the process terminates. Then, exit.
               OutputHeading( "Program exits without freeing a memory block" );
               SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF );
            }
            大概解釋一下,這里的函數都是什么作用:
            1、首先是剛開始的六個函數,這六個函數的作用就是讓接下來的內存調試函數輸出調試信息到控制臺。后面的函數都是實際調試內存的,如果之前調用了這六個函數,那么調試信息會輸出到控制臺。
            2、_CrtMemDumpAllObjectsSince( NULL )函數的作用是輸出目前為止,在堆中申請的空間的所有信息,包括地址,大小,內容。
            3、_CrtDumpMemoryLeaks( )函數的作用是檢測到目前為止,還有哪些堆中申請的內存沒有釋放,包括地址,大小等
            4、SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF )宏的作用是在程序結束的時候檢測堆內存是否還有泄露,作用同CrtDumpMemoryLeaks( )一樣,只不過是在所有該釋放的都結束之后,進行最后的檢查。
            (未完,以后補充)

            posted on 2009-08-11 19:49 把握命運 閱讀(789) 評論(0)  編輯 收藏 引用

            91亚洲国产成人久久精品| 2021国产成人精品久久| 中文字幕久久精品| 欧洲人妻丰满av无码久久不卡| 久久亚洲欧美国产精品 | 久久久久久精品无码人妻| 亚洲人成精品久久久久| 国产午夜免费高清久久影院| 国产精品成人99久久久久 | 久久久无码精品亚洲日韩蜜臀浪潮| 99999久久久久久亚洲| 理论片午午伦夜理片久久| 国产V亚洲V天堂无码久久久| 久久99精品久久久久久秒播| 久久综合狠狠综合久久综合88 | 国产精品99久久99久久久| 久久伊人精品青青草原日本| 久久国产精品久久精品国产| 亚洲va久久久噜噜噜久久| 久久精品国产WWW456C0M| 久久综合久久自在自线精品自| 日批日出水久久亚洲精品tv| 91精品国产91久久久久久蜜臀| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲人AV永久一区二区三区久久 | 97视频久久久| 精品国产一区二区三区久久蜜臀| 好久久免费视频高清| 99久久99久久| 高清免费久久午夜精品| 久久精品蜜芽亚洲国产AV| 无码精品久久久久久人妻中字| 无码任你躁久久久久久老妇App| 思思久久99热免费精品6| 久久中文精品无码中文字幕| 国产精品免费久久久久久久久| 久久本道伊人久久| 久久996热精品xxxx| 久久综合成人网| 国内精品久久久久影院薰衣草| 亚洲人成精品久久久久|