M8 了解各種不同意義的new和delete

2021-09-08 14:20:34 字數 1570 閱讀 7898

1、首先考慮new operator,new operator 可以認為做了三件事情:a、呼叫operator new分配一塊記憶體;b、在這塊記憶體上呼叫構造方法構造物件;返回指標。

2、operator new的宣告如下:

void* operator new(size_t size)

和c中的malloc一樣,operator new只負責分配記憶體。

3、考慮,string* ps = new string("hello"); 相當於做了下列事情:

a、void* memory = operator new (sizeof(string));

b、在*memory上面,呼叫string::string("hello"),構造物件;

c、返回指標,string* ps = static_cast(memory).

4、上面通過operator new 試圖分配一塊記憶體。這存在兩個問題:a、底層介面通過一定演算法分配一塊可用的記憶體,有可能是耗時的;b、也許無法分配一塊可用的記憶體。因此,就有了下面的需求:我提前分配一塊記憶體,然後在這塊記憶體上呼叫構造方法,構造物件,該怎麼辦呢?如下:

widget* constructwidgetonbuffer(void* buffer, int widgetsize)

return new (buffer) widget(widgetsize);

這裡的new operator不同於正常的new operator,中間有個(buffer)。這裡的new operator呼叫placement new,placement new 宣告如下:

void* operator new(size_t, void* location)

return location;

5、考慮,delete operator,可認為做了兩件事:a、指向物件呼叫析構方法;b、執行operator delete釋放記憶體。如下:

string* ps; delete ps; 相當於:

ps->~string();

operator delete(ps);

6、如果只是處理原始,未設初值的記憶體,不應該使用new operator和delete operator,而應該使用operator new和operator delete,如下:

void* buffer = operator new(20);

operator delete(buffer)

這類似於c中的方法malloc和free。

7、特別注意:new與delete的使用要匹配。分別是:

a、operator new 對應operator delete,前面不構造,後面不析構;

b、new operator對應delete operator;

c、對於placement new 不能使用delete operator,因為前者並不分配記憶體,只是使用已有的記憶體構造物件,而delete operator會釋放記憶體,而這塊記憶體別人可能還在使用。因此,應該只是呼叫析構方法;

d、是否帶有,new operator 和delete operator要匹配。如:string* ps = new string[10];  delete ps; delete時中括號放前面。

魅族M8程式設計筆記

1.wince下面沒有time這個函式,可以考慮用gettickcount 2.由版主gzdanny移植的遊戲block2lock,已開源,原始碼http block2lock for m8 renew.googlecode.com 3.m8sdk教程 遊戲開發心得 一 遊戲程式框架 http bb...

魅族M8使用半年談

手上的m8是年初時買的,se版,1880入手,2010年1月8日生產的 現在來說說我的評價吧 第一次用智慧型機 之前用的是tcl3108和三星一低端直板機 感覺那是相當的方便 外觀 大氣 螢幕 驚豔,解析度超高,細膩,贊,上網或看 爽。音質 超好,在宿舍賽過hp本本的音響,外放那是沒得說。放ape時...

Unix整理筆記 vi簡介 里程碑M8

1 vi是unix linx工程師必備的 2 表示是未使用的行,如果某行不是以 開頭,並且仍然是空白的,那麼一定存在空格,製表符,換行符等 3 vi區別大小寫 4 在vi中搜尋檔案,命令模式下 yourword 5 如果進行誤操作了,可以通過下面的方法解決 1 q 2 u3 u 撤銷當前行的操作 6...