1. 程式人生 > >C\C++ 變數生存週期

C\C++ 變數生存週期

程式入口地址為main 那麼 全域性變數的生存週期和釋放會是在什麼時候

程式碼:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;


void writeFile(char *pszbuf){
	FILE *fp = fopen("cxl.txt", "ab+");
	fwrite(pszbuf, strlen(pszbuf),  1,fp);
	fflush(fp);
	fclose(fp);
}


class A{
public:
	A(){
		writeFile("A類開始初始化.......\n");
	}
	~A(){
		writeFile("A類被析構.......\n");
		
		char buf[200] ={0};
		sprintf(buf, "pl 地址:%p.......\n", p);
			writeFile(buf);
	}
	void set(char *pl){
		
		char buf[200] ={0};
		p = pl;
		sprintf(buf, "pl 地址:%p.......\n", p);
			writeFile(buf);
	}
private:
	char *p;
	
};

class B{
public:
	B(){
		writeFile("B類開始初始化.......\n");
	}
	~B(){
		writeFile("B類被析構.......\n");
	}
};

A a;
B b;

int main(){
	
	writeFile("程式入口開始.......\n");
	
	char buf[100] ={0};
	char *p = new char[20];
	memcpy(p,"cxl...hahah",20);
	sprintf(buf, "p 地址:%p.......\n", p);
	writeFile(buf);
		writeFile("set p.......\n");
	a.set(p);
	writeFile("程式入口結束end.......\n");
	
	return 0;
}

改函式的 執行結果:

A類開始初始化.......
B類開始初始化.......
程式入口開始.......
p 地址:00473C30.......
set p.......
pl 地址:00473C30.......
程式入口結束end.......
B類被析構.......
A類被析構.......
pl 地址:00473C30.......

從中可以看到,在執行main 之前先進行了 全域性變數的初始化,按上到下順序執行,然後才是main 函式,而析構則是 下到上。 其中在main中new 出來的p 則在main結束後依然存在,在關閉程式後,檢視該記憶體,則顯示記憶體內容為亂碼,說明已經被作業系統釋放掉了,如果在沒有作業系統的情況下 我們還是要記得 delete掉。

這個全域性初始化和 析構的作用:

 垃圾回收機制: 在單例模式下 可以採用此解構函式進行析構