成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++堆對象如何禁用

開發 后端
C++堆對象產生方法注意就是通過使用new來進行操作。那么如果我們想要禁止產生C++堆對象又該如何進行操作呢?在這里將會給出正確的答案。

C++中對于內存的相關知識是一個比較重要而且復雜的知識點,我們需要不斷的深入的對其進行研究。今天在這里我們將會針對C++堆對象的一些應用方法做一個詳細的介紹,應該可以幫助大家對此有一個深刻的認識。#t#

產生C++堆對象的方法是使用new操作,如果我們禁止使用new不就行了么。再進一步,new操作執行時會調用operator new,而operator new是可以重載的。方法有了,就是使new operator 為private,為了對稱,最好將operator delete也重載為private。

現在,你也許又有疑問了,難道創建棧對象不需要調用new嗎?是的,不需要,因為創建棧對象不需要搜索內存,而是直接調整堆棧指針,將對象壓棧,而operator new的主要任務是搜索合適的堆內存,為C++堆對象分配空間,這在上面已經提到過了。好,讓我們看看下面的示例代碼:

  1. #include stdlib.h 需要用到C式內存分配函數   
  2. class Resource ; 代表需要被封裝的資源類   
  3. class NoHashObject   
  4. {   
  5.  private   
  6.   Resource ptr ;指向被封裝的資源   
  7.   ... ... 其它數據成員   
  8.   void operator new(size_t size) 非嚴格實現,僅作示意之用   
  9.   {   
  10.    return malloc(size) ;   
  11.   }   
  12.   void operator delete(void pp) 非嚴格實現,僅作示意之用   
  13.   {   
  14.    free(pp) ;   
  15.   }   
  16.  public   
  17.   NoHashObject()   
  18.   {   
  19.    此處可以獲得需要封裝的資源,并讓ptr指針指向該資源   
  20.    ptr = new Resource() ;   
  21.   }   
  22.   ~NoHashObject()   
  23.   {   
  24.    delete ptr ; 釋放封裝的資源   
  25.   }   
  26. }; 

NoHashObject現在就是一個禁止C++堆對象的類了,如果你寫下如下代碼:

  1. NoHashObject fp = new NoHashObject() ; 編譯期錯誤!   
  2. delete fp ;  

上面代碼會產生編譯期錯誤。好了,現在你已經知道了如何設計一個禁止堆對象的類了,你也許和我一樣有這樣的疑問,難道在類NoHashObject的定義不能改變的情況下,就一定不能產生該類型的C++堆對象了嗎?不,還是有辦法的,我稱之為“暴力破解法”。C++是如此地強大,強大到你可以用它做你想做的任何事情。這里主要用到的是技巧是指針類型的強制轉換。

  1. void main(void)   
  2. {   
  3. char temp = new char[sizeof(NoHashObject)] ; 

 

強制類型轉換,現在ptr是一個指向NoHashObject對象的指針

  1. NoHashObject obj_ptr = (NoHashObject)temp ;  

temp = NULL ; 防止通過temp指針修改NoHashObject對象

再一次強制類型轉換,讓rp指針指向堆中NoHashObject對象的ptr成員

  1. Resource rp = (Resource)obj_ptr ;  

初始化obj_ptr指向的NoHashObject對象的ptr成員

  1. rp = new Resource() ;  

現在可以通過使用obj_ptr指針使用堆中的NoHashObject對象成員了

  1. ... ...   
  2. delete rp ;釋放資源   
  3. temp = (char)obj_ptr ;   
  4. obj_ptr = NULL ;防止懸掛指針產生   
  5. delete [] temp ;釋放NoHashObject對象所占的堆空間。   

 

上面的實現是麻煩的,而且這種實現方式幾乎不會在實踐中使用,但是我還是寫出來路,因為理解它,對于我們理解C++內存對象是有好處的。對于上面的這么多強制類型轉換,其最根本的是什么了?我們可以這樣理解:

某塊內存中的數據是不變的,而類型就是我們戴上的眼鏡,當我們戴上一種眼鏡后,我們就會用對應的類型來解釋內存中的數據,這樣不同的解釋就得到了不同的信息。

所謂強制類型轉換實際上就是換上另一副眼鏡后再來看同樣的那塊內存數據。

另外要提醒的是,不同的編譯器對對象的成員數據的布局安排可能是不一樣的,比如,大多數編譯器將NoHashObject的ptr指針成員安排在對象空間的頭4個字節,這樣才會保證下面這條語句的轉換動作像我們預期的那樣執行:

  1. Resource rp = (Resource)obj_ptr ;  

但是,并不一定所有的編譯器都是如此。既然我們可以禁止產生某種類型的C++堆對象,那么可以設計一個類,使之不能產生棧對象嗎?當然可以。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-02-03 14:30:04

C++棧對象

2010-01-25 09:50:58

C++函數對象

2010-01-14 14:17:20

Visual C++

2010-01-26 15:51:06

C++變量

2010-01-25 14:18:46

C++對象模型

2010-01-28 10:33:10

C++開發程序

2011-08-25 15:35:18

Lua游戲對象

2010-01-27 10:13:22

C++類對象

2010-02-06 10:50:10

C++統計對象個數

2013-05-27 15:38:37

Java對象C++

2010-01-26 10:53:58

學C++

2010-01-28 13:35:41

調用C++函數

2010-01-27 09:38:27

C++書籍

2011-04-11 13:08:13

對象鏈表C++

2010-01-20 09:54:27

C++數據類型

2011-07-10 15:36:54

C++

2010-01-25 11:13:18

C++棧對象

2010-02-03 17:06:36

C++對象復制

2010-01-18 17:48:46

C++類對象

2010-01-20 09:48:44

面向對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品九九九 | 91精品国产高清久久久久久久久 | 国产片网站 | 亚洲国产成人一区二区 | 91精品国产综合久久久动漫日韩 | 国产精品久久久久久久久久久久久久 | 亚洲性视频网站 | 亚洲高清在线 | 在线日韩中文字幕 | 中文字幕一区二区三区乱码图片 | 91久色| 91麻豆精品国产91久久久久久久久 | 大学生a级毛片免费视频 | 美女黄频| 特级黄一级播放 | jizz在线看片| 国产精品免费一区二区 | av黄色在线 | 毛片视频网址 | 欧美成人黄色小说 | 国产午夜精品视频 | 在线一区观看 | 九九精品在线 | 国产精品日韩一区二区 | 色狠狠桃花综合 | 欧美激情精品久久久久 | 久久久久久国产免费视网址 | 91亚洲精品在线 | 成人不卡 | 亚洲免费在线 | 日韩欧美国产电影 | 中文字幕色站 | 永久av| 人人干人人舔 | 欧美1区 | 亚洲www啪成人一区二区 | 亚洲精品久久久久久久久久久久久 | 国产中文区二幕区2012 | 亚洲一区二区三区四区五区午夜 | 天天干夜夜操 | 91麻豆精品国产91久久久更新资源速度超快 |