C++:預設複製建構函式 執行 淺拷貝

來源:互聯網
上載者:User

C++, 會預設產生一個複製建構函式, 當類中出現指標時, 複製會執行淺拷貝, 即只複製指標的地址, 不會複製資料;

所以在類中, 使用指標時, 需要注意; 如果想使用深拷貝, 可以添加複製建構函式.

以下代碼, 如果不添加複製建構函式, 則會運行出錯, 但可以通過編譯,

運行時, 因為刪除(delete[])兩次str所指的同一片地址空間, 所以程式無法執行.

代碼:

/*  * main.cpp  *  *  Created on: 2014.4.15  *      Author: Spike  */      /*vs2012*/      #include <iostream>  #include <cstring>  #include <vector>  #include <memory>        using namespace std;        class CDemo {  public:      CDemo() : str(NULL) {};      ~CDemo() {          static int i=0;          if (str) {              std::cout << "&Demo" << i++ << " = " << (int*)this << ", str = " << (int*)str << std::endl;              delete[] str;          }      }            //複製建構函式      CDemo(const CDemo& cd) {          this->str = new char[strlen(cd.str) + 1];          strcpy(this->str, cd.str);      }            char* str;  };        int main () {      CDemo d1;      d1.str = new char[32];      strcpy(d1.str, "Caroline");      std::vector<CDemo>* a1 = new std::vector<CDemo>();      a1->push_back(d1); //執行複製建構函式      std::cout << "d1.str = " << d1.str << std::endl;      std::cout << "(*a1)[0].str  = " << (*a1)[0].str << std::endl;      strcpy(d1.str, "Wendy");      std::cout << "d1.str = " << d1.str << std::endl;      std::cout << "(*a1)[0].str  = " << (*a1)[0].str << std::endl;      delete a1;      return 0;  }

輸出:

d1.str = Caroline  (*a1)[0].str  = Caroline  d1.str = Wendy  (*a1)[0].str  = Wendy  &Demo0 = 0x312570, str = 0x312548  &Demo1 = 0x22fec8, str = 0x312548

作者:csdn部落格 Spike_King

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。