C++析構(gòu)函數(shù)不同使用方式
C++編程語言可以被看做是C語言的升級版本,它的許多應(yīng)用方法都與其他編程語言有相似之處。不過在一些特定的使用方法中,還是有些不同的應(yīng)用方式。在這里我們就先來了解一下C++析構(gòu)函數(shù)的一些特殊應(yīng)用方式。
C#中的終結(jié)器(也就是析構(gòu)函數(shù))類似于C++析構(gòu)函數(shù),但是由于編譯時無法確定終結(jié)器的執(zhí)行時機(jī),因此兩者實際上存在相當(dāng)大的區(qū)別。垃圾回收器調(diào)用C#終結(jié)器的時機(jī)是在對象上一次使用之后,但是在應(yīng)用程序關(guān)閉之前的某個時間。相反,只要一個對象(而非指針)超出范圍,(此處的范圍指作用域),就會自動調(diào)用C++析構(gòu)函數(shù)。對此我還真有點懷疑,于是分別寫了C++與C#的代碼看一下情況是否真的是這樣。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- test();
- }
- static void test()
- {
- myPeople p = new myPeople();
- Console.WriteLine("Complate");
- }
- }
- class myPeople
- {
- public myPeople()
- {
- Console.WriteLine("Construct");
- }
- ~myPeople()
- {
- Console.WriteLine("Dispose");
- }
- }
- }
于是我分別在各個方法中插入斷點然后F5開始逐步調(diào)試,我發(fā)現(xiàn)沒有myPeople的調(diào)用是在test()方法執(zhí)行完畢后,Main()方法結(jié)束執(zhí)行器調(diào)用的。再看C++
- #include<iostream>
- #include<string>
- using namespace std;
- class myPeople
- {
- public :
- myPeople()
- {
- cout<<"Construct"<<std::endl;
- }
- ~myPeople()
- {
- cout<<"Dispose"<<std::endl;
- }
- };
- void myMethod()
- {
- myPeople my;;
- cout<<"Complate"<<std::endl;
- }
- int main()
- {
- myMethod();
- }
通過上面的執(zhí)行過程就會發(fā)現(xiàn)確實如同本質(zhì)論作者說的那樣,C#調(diào)用終結(jié)器與C++析構(gòu)函數(shù)區(qū)別是相當(dāng)大的。C#清理一個類的資源并不是確定的,而C++類資源的釋放是該類超出作用域之后便開始調(diào)用析構(gòu)函數(shù)。
【編輯推薦】