要求對象產(chǎn)生于Heap之中
考慮如下代碼:
classHeapClass
{
public:
voidDestory() const {deletethis;}
private:
~HeapClass(){}
};
HeapClass* ptr = newHeapClass;
ptr->Destory();
這樣的調(diào)用真是很厲害,想生成非Heap對象都不成了。
對于繼承和組合的情況不想多說了,比較無趣的說。
判斷某個對象是否位于Heap內(nèi)
考慮如下代碼:
newHeapClass(* newHeapClass);
你覺得編譯器應該怎么做?
1.調(diào)用operator new
2.調(diào)用Constructor
3.調(diào)用第二個operator new
4.調(diào)用第二個Constructor
但是可以讓人足夠驚訝,編譯器對此并不做承諾,所以實際的實現(xiàn)可能是:
1.調(diào)用operator new
2.調(diào)用第二個operator new
3.調(diào)用Constructor
4.調(diào)用第二個Constructor
而VC6是這樣實現(xiàn)的。
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;
}
考慮如下代碼:
classHeapClass
{
public:
voidDestory() const {deletethis;}
private:
~HeapClass(){}
};
HeapClass* ptr = newHeapClass;
ptr->Destory();
這樣的調(diào)用真是很厲害,想生成非Heap對象都不成了。
對于繼承和組合的情況不想多說了,比較無趣的說。
判斷某個對象是否位于Heap內(nèi)
考慮如下代碼:
newHeapClass(* newHeapClass);
你覺得編譯器應該怎么做?
1.調(diào)用operator new
2.調(diào)用Constructor
3.調(diào)用第二個operator new
4.調(diào)用第二個Constructor
但是可以讓人足夠驚訝,編譯器對此并不做承諾,所以實際的實現(xiàn)可能是:
1.調(diào)用operator new
2.調(diào)用第二個operator new
3.調(diào)用Constructor
4.調(diào)用第二個Constructor
而VC6是這樣實現(xiàn)的。
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;
}