国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++中要求(或禁止)對象產生于heap中

2019-11-17 05:27:29
字體:
來源:轉載
供稿:網友

  要求對象產生于Heap之中

  考慮如下代碼:

classHeapClass
{
 public:
  voidDestory() const {deletethis;}
 PRivate:
  ~HeapClass(){}
};
HeapClass* ptr = newHeapClass;
ptr->Destory();
  這樣的調用真是很厲害,想生成非Heap對象都不成了。

  對于繼續和組合的情況不想多說了,比較無趣的說。

  判定某個對象是否位于Heap內

  考慮如下代碼:

newHeapClass(* newHeapClass);
  你覺得編譯器應該怎么做?

  1.調用Operator new

  2.調用ConstrUCtor

  3.調用第二個operator new

  4.調用第二個Constructor

  但是可以讓人足夠驚奇,編譯器對此并不做承諾,所以實際的實現可能是:

  1.調用operator new

  2.調用第二個operator new

  3.調用Constructor

  4.調用第二個Constructor

  而VC6是這樣實現的。

classHeapClass
{
 private:
  void* operatornew[](size_tsize);
  typedefconstvoid * RawAddress;
  voidoperatordelete[](void* ptr);
 public:
  voidoperatordelete(void *ptr)
  {
   printf("delete/n");
   ::operatordelete(ptr);
   m_address.erase(std::remove(m_address.begin(),m_address.end(),ptr),m_address.end());
   return;
  }
  void* operatornew(size_tsize)
  {
   printf("new/n");
   void * ptr = ::operatornew(size);
   m_address.push_back(ptr);
   returnptr;
  }
  HeapClass()
  {
   printf("Constructor!/n");
  }
  HeapClass(constHeapClass&)
  {
   printf("copy Constructor!/n");
  }
  virtualvoidDestory() const {deletethis;}
  virtual ~HeapClass() = 0;
  boolisOnHeap() const
  {
   // const void * rawAddress = dynamic_cast<const void *>(this);
   constvoid * rawAddress = (constvoid *)(this);
   std::deque<RawAddress>::iteratoriter = std::find(m_address.begin(),m_address.end(),rawAddress);
   returniter != m_address.end();
  }
  private:
   staticstd::deque<RawAddress> m_address;
 };

 HeapClass::~HeapClass(){}
 std::deque<HeapClass::RawAddress> HeapClass::m_address;
 classDHeapClass:publicHeapClass
 {};
  我在VC6中寫了這個Demo測試了一下,但是const void * rawAddress = dynamic_cast<const void *>(this);會出現異常,這讓我覺得很郁悶,所以這個Demo只能支持普通的繼續方式,不支持多種繼續和虛擬繼續。

  禁止對象產生于heap之中

  考慮如下代碼:

classHeapClass
{
 private:
  void* operatornew(size_tsize);
  void* operatornew[](size_tsize);
  voidoperatordelete(void *ptr);
  voidoperatordelete[](void* ptr);
 public:
  HeapClass(){printf("Constructor!/n");}
  HeapClass(constHeapClass&){printf("copy Constructor!/n");}
 public:
  ~HeapClass(){}
};
  這確實是比較簡單的事情。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 托里县| 美姑县| 忻州市| 类乌齐县| 天津市| 石首市| 武清区| 靖安县| 正蓝旗| 定远县| 化州市| 甘洛县| 普格县| 望江县| 恩平市| 清流县| 扶余县| 太仆寺旗| 隆子县| 禹城市| 成安县| 汕头市| 太谷县| 郴州市| 平阴县| 蒲城县| 彩票| 韶关市| 塔城市| 格尔木市| 河津市| 蒙自县| 磴口县| 太仆寺旗| 都兰县| 怀化市| 车致| 靖西县| 绥棱县| 义马市| 东方市|