一個關於c++字串處理和delete[]與delete差別的問題 (轉)

gugu99發表於2008-01-05
一個關於c++字串處理和delete[]與delete差別的問題 (轉)[@more@]

  一個關於c++字串處理和delete[]與delete差別的問題
  ---張呂全

先看下面一個字串處理的小例子
 CString str = "zhongguo";//在c++builder中CString 對應的型別AnsiString 其餘一樣
 CString strtwo = str;//值複製
 int *addr = (int*)&strtwo;
 char*p = (char*)*addr;
 *p = 'X';
 AfxMessageBox(str);//cb中為  ShowMessage(str);
  這時大家可以發現strtwo變成了Xhongguo這是正常的,然而再看str 卻也變成了它。顯然兩者都是指向共同的資料區。原來,在vc和c++Builder中在處理字串時,都進行了。當進行賦值操作時,並不進行真正的資料複製操作。而是使二者指向相同的資料區而已,並將該塊的引用數加一。當對字串單個操作等可能破壞其他的資料操作時,才檢查它的引用數,以決定是否要複製一份資料。具體詳細操作,要涉及c++Builder和 vc的各自的記憶體管理方式了。其實這種處理技巧在許多地方隨處可見。如動態連結庫的,以及COM的實現等等。
  還有一個是關於對陣列進行delete和delete[]的差別,我認為至少在vc6.0和c++Builder5.0中(其它版本我也沒有用過!),它們這兩個操作時沒有區別的,例如:
  char * p= new char[100000];
  它操作
  delete p;// 和 delete p[]是等價的
我透過程式碼分析和例子測試兩種途徑,證實兩者是一樣的,然而我見到的所有資料上介紹都是說它們是不一樣的,或許他們說的是c++標準規定,我也沒有空去核查過,嘻嘻,畢竟飯碗要緊!
  拋開程式碼分析,可以做個簡單的測試。分別放兩個按鈕。處理程式碼如下:
一:
  for (int i = 0 ; i < 100000 ; i++)
  {
  char * p= new char[100000];
  delete p;
  }
二:
  for (int i = 0 ; i < 100000 ; i++)
  {
  char * p= new char[100000];
  delete p[];
  }
分別按下測試,可以透過工作管理員(或其他工具)兩者的記憶體增加是一樣的(可能是4k),這是在第一次new時分配的記憶體。這是記憶體分配委託所致的假象。都進行了記憶體釋放!在vc下可以用CMemoryState類進行檢測更方便,具體可以檢視相關的msdn資料了。順便說一下,由於vc在釋放記憶體時,還要進行記憶體塊清零等操作,所以在速度上遠不及c++builder,就是發行版也還是無法和cb的版相媲美的。
  這是我的一些發現,有不同看法的,歡迎與我交流!我的E:">zlqzlqzlq@263.net


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-996468/,如需轉載,請註明出處,否則將追究法律責任。

相關文章