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