簡單的new操作過載以及關於記憶體的一些體會

2021-05-25 04:29:13 字數 1255 閱讀 1539

#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 ...