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

            Benjamin

            靜以修身,儉以養德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數據加載中……

            string和memset

            string類是C++中專門處理字符串的類,它的實際上是basic_string<char>的一個typedef。它有四個跌代器:
            typedef std::reverse_iterator<iterator> reverse_iterator;
            typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
            typedef _String_iterator<_Elem, _Traits, _Alloc> iterator;//models random iterator
            typedef _String_const_iterator<_Elem, _Traits, _Alloc> const_iterator;////models random iterator//models random iterator
            一個靜態常量:static const size_typed npos = -1;
            basic_string模板定義的類型:
            typedef    traits                                                         traits_type;        //某個具體類型的模板參數                       
            typedef    typename traits::char_type                         value_type;      
            typedef   Allocator                                                   allocator_type;
            typedef   typename Allocator::size_type                    size_type;
            typedef   typename Allocator::difference_type           difference_type;
            typedef   typename Allocator::reference                    reference;
            typedef   typename Allocator::const_reference          const_reference;
            typedef   typename Allocator::pointer                        pointer;
            typedef   typename Allocator::const_pointer              const_pointer;
            針對不同的廠商的實現是不同的。
            memset可以用與string類嗎?有網友提出以下問題:
             1 void fun()
             2 {
             3     string temp;
             4     char buff[] = "123456789";
             5     while(true)
             6     {
             7         
             8         memset(&temp, '\0'sizeof(string));
             9         temp = buff;
            10     }
            11 }
            上面的代碼安全性如何?一直想寫篇文章表述一下這個問題,談談自己的看法。最近在項目大量的用到STL,出現了不少問題,上面的問題就是其中之一,上面的代碼肯定不安全。while循環只是放大一下執行效果。
            在VC的string的實現上,有個uion _bxty
            { // storage for small buffer or pointer to larger one
            _elem _buf[_buf_size];
            _elem *_ptr;
            } _bx;
            而_buf_size值為:
            enum
            { // length of internal buffer, [1, 16]
            _buf_size = 16 / sizeof (_elem) <1 ? 1
            : 16 / sizeof(_elem)};
            在模板參數_elem為char時, _buf_size為16, 而union _bx里保存的是一個字符串指針或一個字符緩沖大小, 當字符串長度小于等于15(別忘了字符串還有個0結尾的字符)不必額外分配內存而是直接使用string對象本身已經分配的內存, 否則使用allocator來分配一塊新的內存以保存字符串. 而string不帶任何參數的構造函數調用了_tidy函數, 在這個函數中會設置string的成員變量_myres(預留空間大小)為15(_buf_size-1), 如果將memset用于string,memset就會于破壞其內部變量_myres的值, 導致在之后對string對象進行操作時, 即時字符串大小不大于15也會引發內存分配的動作, 而這實際上是不應該發生的(應該直接使用string本身的內存而不是新申請內存塊), 于是就有了在字符串大小小于16字節時, 分配的內存沒有釋放的結果. 這樣做的結果是會導致內存泄露。

            posted on 2009-05-16 23:24 Benjamin 閱讀(2655) 評論(0)  編輯 收藏 引用 所屬分類: 泛型編程

            国产精品久久久久影院嫩草| 国内精品伊人久久久久AV影院| 国产女人aaa级久久久级| 午夜视频久久久久一区| 久久人人爽人人爽人人片av高请| 国产综合免费精品久久久| 久久国产精品一国产精品金尊| 亚洲精品美女久久久久99小说 | 久久99精品久久久久久| 精品久久久久久国产| 久久久噜噜噜久久| 久久国产视屏| 欧美激情精品久久久久久| 久久夜色精品国产噜噜亚洲AV| 国产精品免费久久久久影院| 久久国产亚洲精品| 精品久久久久久久久午夜福利| 国产69精品久久久久9999| 青青草原精品99久久精品66| 国产精品综合久久第一页| .精品久久久麻豆国产精品| 亚洲精品第一综合99久久| 国产成人久久777777| 国产亚洲美女精品久久久久狼| 欧美大香线蕉线伊人久久| AV无码久久久久不卡蜜桃| 久久精品国产亚洲av麻豆色欲| 性做久久久久久免费观看| 久久中文字幕一区二区| 久久99亚洲综合精品首页| 久久九九亚洲精品| 久久久久久亚洲Av无码精品专口| 久久国产欧美日韩精品免费| 久久91精品综合国产首页| 99久久人人爽亚洲精品美女| 久久久久亚洲?V成人无码| 亚洲一本综合久久| 国产精品成人99久久久久91gav | 2021少妇久久久久久久久久| 久久久久99精品成人片欧美| 精品久久人妻av中文字幕|