#include
#include
#include
class opnew
;handle opnew::s_hheap = null;
uint opnew::s_unumallocsinheap = 0;
opnew::opnew()
opnew::~opnew()
void * opnew::operator new(size_t size)
void *p = heapalloc(s_hheap, heap_zero_memory, size);
if(p != null)
return p;
}void opnew::operator delete(void *p)
if(s_unumallocsinheap == 0)
}void test1()
void test2
void test3
void main()
上面只是乙個過載new以及delete的簡單例子。但是從中我也發現了一些東西。
當我們執行程式後,會發現 test1 test3 呼叫了析構函式。但是test2沒有呼叫。這是為什麼呢?
1.opnew op1;
是在棧上位變數分配記憶體。而在棧上分配的記憶體,在出了變數的作用域後會自動銷毀。所以test1呼叫完之後,物件op1也就銷毀了,因此會自動呼叫析構函式。
2.opnew *op1 = new opnew;
opnew *op2 = new opnew;
opnew *op3 = new opnew;
則不同了。我們過載了new(*),是在堆上分配記憶體,在你手動銷毀它之前是不會銷毀的。所以test2的呼叫結束後,雖然出了區域性變數(物件)op1(2,3)的作用域,但是因為記憶體沒有被銷毀,所以變數(物件)沒有被銷毀。因此也就不會自動呼叫析構函式了。
*當然了,系統預設的new也是在堆上分配記憶體的。
3.opnew *op1 = new opnew;
opnew *op2 = new opnew;
opnew *op3 = new opnew;
delete op3;
delete op2;
delete op1;
因為我們呼叫了delete來銷毀分配的記憶體,物件也被銷毀了。所以會呼叫析構函式。
總之,我們平時說堆疊,其實是2個不同的概念。在寫程式的時候,涉及到記憶體管理的時候,應該要區分這2個概念。
new操作符過載的使用
include include class blanks void blanks operator new size t stallocateblock,char chinit int main 過載new操作符第乙個引數必須是size t型別,並且傳入的值就是類的大小。因為類的大小為1。如果類中含...
C 中的 , 等符號過載,以及過載等號操作
通過乙個實際的例子來介紹。其中過載 equal,gethashcode函式。以上就是介紹過載 equal,gethashcode的方法。但是有的時候我們需要過載 操作符,來方便我們進行傳遞,這在c 裡可以使用符號過載來實現,但是c 裡面就行不通了,不信你可以試試,編譯器會報錯的。c 裡實現相同效果使...
vc中new和delete操作符的過載
在c 中過載new和delete操作符可以給程式帶來更靈活的儲存控制,對於遊戲設計等對效率要求較高的應用而言是必不可少的。一般的c 書籍中也會介紹它們的應用和實現,然而在vc中實現卻有幾個必須注意的地方,否則編譯會出現問題。首先,vc在每個自動生成的cpp檔案中都會加入如下 ifdef debug ...