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

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            // 結點類

            class Node {

            public:

                Node() {

                }


                Node(int key, std::string data) : key(key), data(data) {

                }


                bool operator<(const Node &other) {

                    if (key < other.key) {

                        return true;

                    } else {

                        return false;

                    }

                }


                Node& operator=(const Node &other) {

                    if (this != &other) {

                        key = other.key;

                        data = other.data;

                    }


                    return *this;

                }


                friend std::ostream& operator<<(std::ostream &out, const Node &note) {

                    out << "\'" << note.key << "," << note.data << "\'";

                    return out;

                }


                int key;

                std::string data;

            };

                // 給此結點的數(shù)組動態(tài)分配內存

                void reallocate() {

                    int newCapacity = capacity * 2;

                    T *tempData = new T[newCapacity];

            // memcpy(tempData, data, capacity * sizeof(T)); // [[[[1]]]]

                    for (int i = 0; i < capacity; ++i) {tempData[i] = data[i];}// [[[[2]]]]

                    

            delete[] data;

                    data = tempData;

                    size = capacity;

                    capacity = newCapacity;

                }

            Node中的std::string中的字符串是用char*來存儲的。如果使用[[[[1]]]]處的memcpy,由于memcpy只是淺拷貝,簡單的把Node中的std::string的char*的首地址給拷貝過來,而其中真正的字符串內容并沒有復制過來,所以在delete[] data后,源Node中的std::string被釋放,所以其中的字符串也被刪除掉了。而在新的tempData->data->std::string.char*所指向的內容已經(jīng)是無效的了,所以就出問題了。而使用[[[[2]]]]處的for循環(huán)來一個一個的復制對象,因為std::string的運算符=被重載過了,而會把其中的字符串內容也同時復制,所以就不會出現(xiàn)使用memcpy時出現(xiàn)的問題。


            事實上就是一個深拷貝與淺拷貝的問題,這個錯誤有時不太容易被發(fā)現(xiàn)。

            posted on 2009-12-23 19:27 逛奔的蝸牛 閱讀(4351) 評論(5)  編輯 收藏 引用 所屬分類: C/C++

            評論

            # re: C/C++: memcpy()血淚史 2009-12-23 22:01 陳梓瀚(vczh)
            我覺得,太喜歡用C函數(shù),才是很多錯誤的根源。=就=,不要沒事memcpy,除非編譯有錯誤。要是真的有錯誤了,如果那個東西是你寫的,你也給補上operator=,不要memcpy。  回復  更多評論
              

            # re: C/C++: memcpy()血淚史 2009-12-23 23:15 暗金裝備
            @陳梓瀚(vczh)
            呵呵,就是想著,memcpy速度快,汗。  回復  更多評論
              

            # re: C/C++: memcpy()血淚史 2009-12-24 13:00 陳梓瀚(vczh)
            @暗金裝備
            如果你了解過x86你就會知道,其實編譯器生成的operator=比memcpy更快……  回復  更多評論
              

            # re: C/C++: memcpy()血淚史 2010-02-06 00:28 ddd
            因為std::string的運算符=被重載過了
            樓主以上觀點不準確
            data[i]實際上是值類型了,不是引用類型(不是內存地址,不是指針)
            所以temp[i]=data[i]就相當于 char c='a'; char d=c;
            在這里=是標準的賦值符號,沒有重載  回復  更多評論
              

            # re: C/C++: memcpy()血淚史 2010-11-21 13:09 李現(xiàn)民
            @陳梓瀚(vczh)
            這是為什么? 好像stlport中std::string的operator= 就是用memcpy實現(xiàn)的吧  回復  更多評論
              

            狠狠色丁香久久婷婷综合| 亚洲AV成人无码久久精品老人| 国产成人久久激情91| 久久精品国产亚洲一区二区| 久久国产三级无码一区二区| 久久婷婷色香五月综合激情| 亚洲婷婷国产精品电影人久久| 伊人久久大香线蕉综合5g| 色诱久久久久综合网ywww| 精品久久久久久久久久久久久久久 | 色综合久久88色综合天天| 久久综合伊人77777麻豆| 亚洲国产精品无码久久98| 久久婷婷五月综合97色直播| 国产亚洲精久久久久久无码| 色婷婷综合久久久久中文字幕| 久久精品国产99久久久| 久久人做人爽一区二区三区| 亚洲国产精品一区二区久久| 无码国内精品久久综合88| 99久久精品国产一区二区三区 | 久久精品国产免费一区| 久久亚洲中文字幕精品一区| 久久国产视屏| 久久激情亚洲精品无码?V| 天天爽天天爽天天片a久久网| 久久久久久亚洲AV无码专区| 久久综合亚洲色HEZYO社区 | 亚洲国产成人久久综合碰碰动漫3d| 久久久久久久91精品免费观看| 国产精品久久久久一区二区三区| 999久久久免费精品国产| 中文字幕乱码人妻无码久久| 综合久久给合久久狠狠狠97色| 欧美久久天天综合香蕉伊| 国内精品伊人久久久久网站| 久久久久国产一区二区三区| 人妻无码精品久久亚瑟影视| 人妻无码精品久久亚瑟影视 | 亚洲狠狠综合久久| 麻豆精品久久久一区二区|