一個關於c++字串處理和delete[]與delete差別的問題 (轉)
一個關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於delete,drop,truncate的問題delete
- Oracle delete 高水位線處理問題Oracledelete
- delete 和 delete [] 的真正區別delete
- rman 中delete 與delete force 的區別delete
- MySQL DELETE 表別名問題MySqldelete
- 關於高水位線和deletedelete
- delete 語句帶別名問題.delete
- DELETE TABLE資料後,查詢變慢,問題處理delete
- RMAN 中delete exipired 和 delete obsolete 的區別delete
- malloc/free 和 new /delete 的區別 (轉)delete
- rman 中的 delete all input 和 delete input 的區別delete
- truncate與delete的區別delete
- truncate和delete 的區別delete
- backup archivelog delete input 與delete all input 區別Hivedelete
- oracle truncate 與 delete 的區別Oracledelete
- 關於delete還是update會產生更多日誌的問題delete
- delete與delete[]需要注意的地方delete
- delete input 與 delete all inputdelete
- delete OBSOLETE 與 delete expirieddelete
- 【C++學習筆記】一個使用new和delete的例項C++筆記delete
- malloc free與new delete的區別和聯絡delete
- Handler_delete和Com_delete有什麼關係delete
- 關於C++ delete 來釋放new分配的記憶體C++delete記憶體
- 一些關於VB中字串操作的問題和回答 (轉)字串
- 一個關於資料庫閃回區問題的處理資料庫
- delete和truncate刪除的區別delete
- Oracle中truncate和delete的區別Oracledelete
- 回覆網友問題,關於一個數值和字串一起累加的問題!字串
- SQL truncate 、delete與drop區別SQLdelete
- HWM和delete,drop,truncate的關係delete
- 關於delete cascade的小實驗delete
- truncate delete 的區別delete
- C++中過載new和delete的使用C++delete
- c++中new和delete的使用方法C++delete
- zt_orafaq_delete與truncate的區別delete
- 主外來鍵關聯刪除(on delete set null和on delete cascade)deleteNull
- Delete,insert,update與undo的關係[轉載TOM文章]delete
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete