<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      閑人草堂

        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理

      程序運行中,最詭異的就是內存問題了。(限于個人經驗問題,暫時只碰到這個程度的,如果還有詭異程度更甚的,請告訴我)內存問題仿佛天外流星,不知其何時來,不知其癥狀如何,飄忽不定,直到程序崩潰為止。

      今天就碰到了一例。

      void fun()
      {
         vector<double> v1;
         vector<double> v2;
      
         process();
         ........
      }
      

      在某個函數體內,申明了v1,和v2兩個vector,然后balabala,直到要退出fun的作用域,析構v1的時候,程序崩潰。

      嘗試著把v1,v2的申明順序換了一下,癥狀變了,在析構v2的時候出錯;接著嘗試,把v1,v2設為static變量,發現這會不報錯,但是出了fun函數之后,在其他函數體內又出現類似的問題。

      至此,基本可以下結論了。這是一起典型的內存問題,可能是數組訪問越界,可能是內存泄露等等。

      你想問,為什么可以下這個結論?我們可以來分析一下:

      首先,并不是v1,或者v2的析構出錯;而是第一個申明的變量析構出問題。這給了你什么啟發?在函數體內申明的變量(非static,也不是用new申請的內存空間),都屬于局部變量,程序統一用棧來管理。申明的時候一個個push進棧,退出作用域的時候,一個個pop出棧,調用變量自身的析構函數。當pop到最后一個的時候出錯,說明棧已經被弄亂了,無法根據地址正確的調用該變量的析構函數。

      為什么用static變量就不報錯呢,很簡單,static是全局的,不會在退出函數作用域的時候被析構。

      接下來,使用二分法定位,發現問題就在process()這個函數體內了??墒沁@個函數體有數百行,該怎么查呢。

      這時候只能用valgrind來幫忙了(沒聽過valgrind的同學自己google吧)。終于發現了一處數組訪問越界,我了個去,忙活了大半天就是為了這個錯誤……

      問題是解決了,但是該怎么辦才能保證以后類似的問題不發生呢?

      c++并不會檢查數組訪問是否越界,那我們該怎么做呢。

      一個想法是,對于自定義的數據結構,重載(),對于下標運算,先assert一下,看看下標有沒有越界,但是對于內建的數組,或者stl容器,我就不知道有什么辦法可以在編譯時檢查,或者在運行出錯的時候能夠給出一個明確的錯誤信息。

      如果有人對于這方面有啥心得體會,請不吝賜教!

      posted on 2011-08-05 14:30  閑人草堂  閱讀(386)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 97久久超碰亚洲视觉盛宴| 成人性无码专区免费视频| 无码一区二区三区中文字幕| 国产乱码1卡二卡3卡四卡5| 欧洲美熟女乱又伦免费视频| 开心婷婷五月激情综合社区| www国产成人免费观看视频| 18禁无遮挡啪啪无码网站破解版| 蜜臀av无码一区二区三区| 国产精品一区二区传媒蜜臀| 久久久综合九色合综| 久久综合开心激情五月天| 一区二区视频观看在线| 亚洲午夜久久久影院伊人| 玩弄放荡人妻少妇系列| 亚洲成人av在线系列| 久久香蕉国产亚洲av麻豆| 人妻熟女一二三区夜夜爱| 亚洲AV无码东方伊甸园| 中文字幕不卡在线播放 | 欧美亚洲日本国产其他| 亚洲午夜亚洲精品国产成人| 久久精品麻豆日日躁夜夜躁| 99久久久国产精品免费无卡顿| 欧美国产日韩在线三区| 四虎国产精品免费久久久| 象山县| 国产精品色三级在线观看| 少妇高清一区二区免费看| 亚洲av色综合久久综合| 国产成人午夜福利院| 白玉县| 亚洲av一本二本三本| 中文字幕日韩精品有码视频| 不卡一区二区三区四区视频| 国产亚洲精品VA片在线播放| 国产乱子伦视频在线播放| 精品无码久久久久久尤物 | 四房播色综合久久婷婷 | 不卡免费一区二区日韩av| 美女内射毛片在线看3d|