程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中 destory() 和deallocate()以及delete函數的相關性和區別性,destorydeallocate

C++中 destory() 和deallocate()以及delete函數的相關性和區別性,destorydeallocate

編輯:C++入門知識

C++中 destory() 和deallocate()以及delete函數的相關性和區別性,destorydeallocate


  

這裡非常的繞口  需要仔細的來看看:

 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點  就能保證內存不能洩露了  嘿嘿  這節就說到這裡哦  寫這個也是為了記憶和方便以後查閱


c++ 中 析構函數中 delete與destory的不同是

delete是以給的地址為首地址,釋放對象大小的內從空間給系統。如果對象是類對象,其實還是調用析構函數。
析構函數是從派生類開始析構,釋放成員變量的內從空間,最後析構基類。

至於系統是怎麼回收這些內從空間的,樓主就沒必要去深究了。
當不再使用某個對象時,應該及時回收它,以便把這個對象占用的內存釋放出來。可 以通過調用一個注銷方法來撤銷對象,它會釋放分配給這個對象的內存。這個注銷方法就 是析構方法。構造方法名也可以是任意合法的標識符,但通常使用 Destroy 標識符聲明 .
在 C++中,當對象離開作用域時,靜態聲明的對象的析構函數是自動調用的,對動態 申請的對象必須用 Delete 關鍵字來執行析構函數。
 

OpenGL是什東東?

當然有自帶啦!!不信運行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環境中使用,......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved