C++編程語言可以被看做是C語言的升級版本,它的許多應用方法都與其他編程語言有相似之處。不過在一些特定的使用方法中,還是有些不同的應用方式。在這裡我們就先來了解一下C++析構函數的一些特殊應用方式。
C#中的終結器(也就是析構函數)類似於C++析構函數,但是由於編譯時無法確定終結器的執行時機,因此兩者實際上存在相當大的區別。垃圾回收器調用C#終結器的時機是在對象上一次使用之後,但是在應用程序關閉之前的某個時間。相反,只要一個對象(而非指針)超出范圍,(此處的范圍指作用域),就會自動調用C++析構函數。對此我還真有點懷疑,於是分別寫了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開始逐步調試,我發現沒有myPeople的調用是在test()方法執行完畢後,Main()方法結束執行器調用的。再看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();
- }
通過上面的執行過程就會發現確實如同本質論作者說的那樣,C#調用終結器與C++析構函數區別是相當大的。C#清理一個類的資源並不是確定的,而C++類資源的釋放是該類超出作用域之後便開始調用析構函數。