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

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

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

      C++ 之 stl::string 寫時拷貝導致的問題

      一、寫時拷貝原理

      String是使用計數器來記錄引用計數,當有新的string對象共享內存塊時,計數器+1,當有對象觸發寫時拷貝或析構時,計數器-1。

      那么計數器存放在哪里呢?std::string會在堆里分配空間存儲計數器,由第一個創建的對象分配并初始化計數器。stl的實現就是在string內存空間的最前面分配了空間存儲計數器。

       
      string的所有賦值、拷貝構造操作,計數器都會+1;修改string數據時,先判斷計數器是否為0(0代表沒有其他對象共享內存空間),為0則可以直接使用內存空間,否則觸發寫時拷貝,計數器-1,拷貝一份數據出來修改,并且新的內存計數器置0。
      string對象析構時,如果計數器為0則釋放內存空間,否則計數器-1。

       

      二、寫時拷貝容易引發的問題

      問題主要出現在直接使用 sprintf 操作 string 的內部指針地址 (char)s.c_str() 。 

      #include <stdio.h>
      #include <iostream>
      #include <string>

      int main()
      {
      std::string s1 = "efghijk";
      std::string s2 = s1;
      std::string s3 = s1;
      sprintf((char*)s1.c_str(), "%s", "abcde");

      std::cout << "s1=" << s1 << std::endl;
      std::cout << "s2=" << s2 << std::endl;
      std::cout << "s3=" << s3 << std::endl;
      }

      輸出結果為(j沒有顯示在string是由于在sprintf時,abcde后面還有一個\0字符):
      s1=abcdek
      s2=abcdek
      s3=abcdek

      通過 string::resize() 分配內存空間。 通過 string::c_str() 直接獲取內存空間的起始地址并寫入數據。

      這樣會導致s1和s2和s3都發生變化,所以盡量不要使用string的.c_str函數進行賦值操作,不然容易由于copy on right導致的無法直觀想到的錯誤。

      posted @ 2020-01-17 10:49  代碼的搬運工  閱讀(692)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲AV无码久久精品成人| 成人免费无遮挡在线播放| 亚洲一区二区av在线| 四虎永久免费很黄的视频| 久久99精品久久久久久| 日本精品中文字幕在线不卡| 人妻av资源先锋影音av资源| 国产精一品亚洲二区在线播放| 奇米四色7777中文字幕| 国产精品黄色精品黄色大片| 欧美亚洲国产日韩电影在线| 制服 丝袜 亚洲 中文 综合| 中文字幕在线日韩| 护士张开腿被奷日出白浆| 国产一区二区三区在线观看免费| 国产午夜精品无码一区二区| 狠狠精品久久久无码中文字幕| 人妻少妇偷人精品一区| 国产激情无码一区二区三区| 久久乐国产精品亚洲综合| 亚洲大尺度无码专区尤物| 精品一区精品二区制服| 国产亚洲一二三区精品| 毛茸茸性xxxx毛茸茸毛茸茸| 丰满爆乳一区二区三区| 国产av综合一区二区三区| 91国产自拍一区二区三区| 国产成人剧情AV麻豆果冻| 妺妺窝人体色www聚色窝仙踪| 色吊丝中文字幕在线观看| 天天狠天天透天天伊人| 成人精品色一区二区三区| 免费a级毛视频| 日韩有码中文在线观看| 91午夜福利一区二区三区| 亚洲熟妇色xxxxx亚洲| 亚洲综合一区二区三区在线| 日本高清中文字幕免费一区二区| 欧美性猛交xxxx乱大交丰满| 亚洲综合色一区二区三区| 日韩av裸体在线播放|