這裡非常的繞口 需要仔細的來看看:
destory(): 顯示調用一個對象的析構函數 相當於釋放一個對象需要釋放的一些動態內存 為下次真正釋放對象做准備
deallocate():真正的釋放一個內存塊。這是一個上層封裝也就是delete函數的上層封裝 在STL的空間配置器中 有可能會調用delete還給OS 也有可能就是放在內存池中 但是對於用戶來講就是釋放內存塊。
看一個例子 應該就明白了真正的含義了:
#include <iostream> #include <stdlib.h> #include <unistd.h> using namespace std; class A { public: A() { data=new char[1000000]; } ~A() { //free the data memory delete []data; } private: char *data; }; int main(int argc,char* argv[]) { for(;;) { A *a=new A; std::allocator<A> allocat; allocat.deallocate(a,sizeof(A)); } return 0; }
明顯 這樣的做法會出問題,運行到一定的時間內會拋出異常。所以deallocate只是釋放對象內存,並沒有調用對象的構造函數釋放對象內的動態內存 這點要注意 如果調用了一個 allocat.destory(a); 程序就不會有bug了
所以在C++中, 對象釋放和對象內動態內存釋放是需要注意的 弄不好 就會出現內存洩露現象。
這裡的delete操作符號本身帶有2個動作:調用析構函數 2釋放內存。而::operator delete就只有釋放內存。 deallocate函數就是基於operator delete函數封裝的。 這點需要記住
可以通過看STL源碼發現 :像vector()的析構函數都是有2個操作: destory() 釋放對象內的動態內存(如果有) deallocate是釋放對象本身占有的內存 通過這2點 就能保證內存不能洩露了 嘿嘿 這節就說到這裡哦 寫這個也是為了記憶和方便以後查閱
delete是以給的地址為首地址,釋放對象大小的內從空間給系統。如果對象是類對象,其實還是調用析構函數。
析構函數是從派生類開始析構,釋放成員變量的內從空間,最後析構基類。
至於系統是怎麼回收這些內從空間的,樓主就沒必要去深究了。
當不再使用某個對象時,應該及時回收它,以便把這個對象占用的內存釋放出來。可 以通過調用一個注銷方法來撤銷對象,它會釋放分配給這個對象的內存。這個注銷方法就 是析構方法。構造方法名也可以是任意合法的標識符,但通常使用 Destroy 標識符聲明 .
在 C++中,當對象離開作用域時,靜態聲明的對象的析構函數是自動調用的,對動態 申請的對象必須用 Delete 關鍵字來執行析構函數。
當然有自帶啦!!不信運行DXDIAG試試看!
OpenGL三維圖形標准是由AT&T公司UNIX軟件實驗室、IBM
、DEC、SUN、HP、Microsoft和SGI等多家公司在GL圖形庫標准的基礎
上聯合推出的開放式圖形庫,它使在微機上實現三維真實
感圖形的生成與顯示成為可能。由於OpenGL是開放的圖形標
准,用戶原先在UNIX下開發的OpenGL圖形軟件很容易移植到微
機上的WindowsNT/95上。筆者在VisualC++4.1(以下簡稱VC)集
成環境下,開發了基於OpenGL的三維真實感圖形應用程序,現
介紹如下。
微機上的OpenGL開發環境
基於OpenGL標准開發的應用程序必須運行於32位Windows
平台下,如WindowsNT或Windows95環境;而且運行時還需有動態
鏈接庫OpenGL32.DLL、Glu32.DLL,這兩個文件在安裝WindowsNT時已
自動裝載到C:\WINNT\SYSTEM32目錄下(這裡假定用戶將WindowsNT
安裝在C盤上);而對於使用Windows95平台的用戶,則需手工將
兩個動態庫復制到Windows95目錄的SYSTEM子目錄中。安裝了
WindowsNT/95和VC4.1後,用戶就具備了基於OpenGL開發三維圖
形軟件的基本條件。
OpenGL程序設計的基本步驟
1.OpenGL在WindowsNT下的運行機制
OpenGL工作在客戶機/服務器模式下,當客戶方(即基
於OpenGL標准開發的應用程序)向服務器(OpenGL核心機制)發出
命令時,由服務器負責解釋這些命令。通常情況下,客戶方
和服務器是運行在同一台微機上的。由於OpenGL的運行機制
是客戶機/服務器模式,這使得用戶能夠十分方便地在網
絡環境下使用OpenGL,OpenGL在WindowsNT上的這種實現方式通常
稱為網絡透明性。
OpenGL的圖形庫函數封裝在動態鏈接庫OpenGL32.DLL中,
客戶機中的所有OpenGL函數調用,都被傳送到服務器上,由
WinSrv.DLL實現功能,再將經過處理的指令發送到Win32設備驅
動接口(DDI),從而實現在計算機屏幕上產生圖像。
若使用OpenGL圖形加速卡,則上述機制中將添加兩個
驅動器:OpenGL可裝載客戶模塊(OpenGLICD)將安裝在客戶端;硬
件指定DDI將安裝在服務器端,與WinDDI同一級別。
2.OpenGL的庫函數
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函
數。OpenGL函數命令方式十分有規律,每個庫函數均有前綴gl
、glu、aux,分別表示該函數屬於OpenGL基本庫、實用庫或輔助
庫。WindowsNT下的OpenGL包含了100多個核心函數,均以gl作為前
綴,同時還支持另外四類函數:
OpenGL實用庫函數:43個,以glu作為前綴;
OpenGL輔助庫函數:31個,以aux作為前綴;
Windows專用庫函數(WGL):6個,以wgl作為前綴;
Win32API函數(WGL):5個,無前綴。
OpenGL的115個核心函數提供了最基本的功能,可以實
現三維建模、建立光照模型、反走樣、紋理映射等;OpenGL實
用庫函數在核心函數的上一層,這類函數提供了簡單的調
用方法,其實質是調用核心函數,目的是減輕開發者的編程
工作量;OpenGL輔助庫函數是一些特殊的函數,可以供初學者
熟悉OpenGL的編程機制,然而使用輔助庫函數的應用程序只
能在Win32環境中使用,......余下全文>>