C\C++ 變數生存週期
阿新 • • 發佈:2019-01-05
程式入口地址為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掉。
這個全域性初始化和 析構的作用:
垃圾回收機制: 在單例模式下 可以採用此解構函式進行析構