• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            內(nèi)存崩潰的BUG
            內(nèi)存崩潰的BUG (2)
            內(nèi)存崩潰的BUG (3)

            連續(xù)三天在跟蹤同個(gè)問(wèn)題!!!!!!!!

            今天重現(xiàn)了幾次問(wèn)題,都是下面的原因?qū)е碌摹?br />
            首先要說(shuō)下IOCP的實(shí)現(xiàn)

            下面的發(fā)送包時(shí)的代碼
            -------------------------------------------------------------------------
            PER_IO_CONTEXT* overlappedEx=new PER_IO_CONTEXT
            overlappedEx->IOOperation= WRITE;
            overlappedEx->wsabuf.buf= (char *)malloc( nLen );
            if( NULL == overlappedEx->wsabuf.buf )
            {
            delete overlappedEx;
            return -1;
            }

            if(WSASend(m_socket,&(overlappedEx->wsabuf), 0x01, &dwBytes, 0x00, &(overlappedEx->Overlapped), NULL ) == SOCKET_ERROR)
            -------------------------------------------------------------------------


            下面是完成端口通知時(shí)的處理代碼
            -------------------------------------------------------------------------
            ?while (m_bIsRun)
            ?{
            ??result = GetQueuedCompletionStatus(m_hCompletionPort,&iosize,&key,&overlapped,INFINITE);
            ??if ( 0 == key )?
            ??{
            ???break;
            ??}
            ??if( NULL != overlappedEx )
            ??{
            ???if ( WRITE == overlappedEx->IOOperation )
            ???{???
            ????delete overlappedEx;
            ????continue;
            ???}
            }

            ……
            }
            -------------------------------------------------------------------------

            之后在?????delete overlappedEx; 前面用 OutPutDebugString 打印了調(diào)試信息, 發(fā)現(xiàn)在?
            ?delete overlappedEx; 執(zhí)行后

            WSASend 里面還會(huì)訪問(wèn)到? overlappedEx 下面的??Overlapped,結(jié)果就在 WSASend 出錯(cuò)了

            overlappedEx 的結(jié)構(gòu)體定義如下:

            struct PER_IO_CONTEXT
            {
            ?WSAOVERLAPPED????Overlapped;
            ?WSABUF????????????????????? wsabuf;
            ?IO_OPERATION?????????IOOperation;
            };


            查了下 MSDN? WSASend 函數(shù)的說(shuō)明,無(wú)頭緒,明天繼續(xù)

            Feedback

            # re: 內(nèi)存崩潰的BUG (4) 完成端口的問(wèn)題? 程序的BUG?[未登錄](méi)  回復(fù)  更多評(píng)論   

            2009-04-02 19:48 by cppexplore
            .............................
            內(nèi)存檢測(cè)工具跑一遍就能發(fā)現(xiàn)的問(wèn)題,你還真執(zhí)著啊。

            # re: 內(nèi)存崩潰的BUG (4) 完成端口的問(wèn)題? 程序的BUG?  回復(fù)  更多評(píng)論   

            2009-04-07 13:14 by freeeyes
            推薦你使用完全端口的時(shí)候,一定要注意判空操作。
            如果我是你的話,就這么寫(xiě)。
            while (m_bIsRun)
            {
            result = GetQueuedCompletionStatus(m_hCompletionPort,&iosize,&key,&overlapped,INFINITE);
            if ( 0 == key )
            {
            break;
            }
            if( NULL != overlappedEx )
            {
            if ( WRITE == overlappedEx->IOOperation )
            {
            delete overlappedEx;
            overlappedEx = NULL;
            continue;
            }
            }

            而且在使用Send的同時(shí),可能會(huì)出現(xiàn)這樣的情況。就是你發(fā)送的Send數(shù)據(jù)還在緩沖區(qū)的時(shí)候,你的overlappedEx對(duì)象被釋放,造成的內(nèi)存崩潰的現(xiàn)象。我的做法是增加一些數(shù)據(jù)鎖。同時(shí),在要?jiǎng)h除overlappedEx的時(shí)候,先判定寫(xiě)標(biāo)志是否在進(jìn)行。如果有做一個(gè)定時(shí)器,延時(shí)幾秒刪除對(duì)象(將對(duì)象放入刪除隊(duì)列),這樣似乎比較好。ACE下的思想也是這樣的。
            另外,我不太明白你為什么要在WRITE == overlappedEx->IOOperation 的時(shí)候進(jìn)行刪除對(duì)象操作?

            # re: 內(nèi)存崩潰的BUG (4) 完成端口的問(wèn)題? 程序的BUG?  回復(fù)  更多評(píng)論   

            2009-04-20 23:07 by hearts
            我也遇到了這個(gè)問(wèn)題。樓主發(fā)現(xiàn)的是對(duì)的。也是不知道為什么。只好對(duì)overlapped進(jìn)行引用計(jì)數(shù)。問(wèn)題倒是解決了,不過(guò)覺(jué)得做法很丑陋。不知道有沒(méi)有好的解決辦法。可能HasOverlappedCompleted有些幫助

            # re: 內(nèi)存崩潰的BUG (4) 完成端口的問(wèn)題? 程序的BUG?  回復(fù)  更多評(píng)論   

            2009-10-17 13:47 by FreeChord
            delete overlappedEx;

            這塊內(nèi)存(buf)沒(méi)free啊!
            overlappedEx->wsabuf.buf= (char *)malloc( nLen );
            色婷婷狠狠久久综合五月| 99久久99久久精品国产片果冻| 精品永久久福利一区二区| 国产99久久久久久免费看| 免费一级做a爰片久久毛片潮| 亚洲熟妇无码另类久久久| 精品久久久久久国产| 亚洲精品无码专区久久同性男| 热re99久久6国产精品免费| 国产精品青草久久久久福利99| 久久九九兔免费精品6| 国产成人综合久久精品尤物| 日本强好片久久久久久AAA| 日韩欧美亚洲综合久久影院Ds| 狠狠色婷婷久久一区二区三区| 国产精品美女久久福利网站| 品成人欧美大片久久国产欧美| 亚洲成色WWW久久网站| 久久久久亚洲av毛片大| 久久婷婷久久一区二区三区| 7777精品久久久大香线蕉| 免费一级做a爰片久久毛片潮| 青青草原1769久久免费播放| 午夜精品久久久久久中宇| 久久这里都是精品| 久久综合久久伊人| 丁香久久婷婷国产午夜视频| 精品久久久久久亚洲| 国内精品伊人久久久久av一坑| 无码日韩人妻精品久久蜜桃| 大香伊人久久精品一区二区| 久久婷婷五月综合色奶水99啪| 久久精品国产黑森林| 久久99精品久久久久久野外| 一本一道久久精品综合| 精品无码人妻久久久久久| 国产 亚洲 欧美 另类 久久| 精品久久久久久国产三级| 久久久久亚洲AV成人网人人软件| 久久精品国产亚洲Aⅴ香蕉 | 亚洲一级Av无码毛片久久精品|