<c++> new並不確保會進行初始化
阿新 • • 發佈:2021-07-21
0、 new運算子並不一定會進行初始化!!
1、 我們都知道new出來的空間是在 靜態 / 全域性區(堆)的
但它並不一定會得到初始化,例如在VS2019中就沒有,這裡舉例了4種常見的
分別是:全域性區new,全域性區宣告,函式內new,函式內宣告
如果直接執行會報錯,顯然是因為函式內宣告需要初始化後才能訪問
既然如此,我們只需要給 函式內宣告的變數 fun_int 初始化即可執行
可以看到,編譯器唯一會幫我們初始化的只有在全域性區直接宣告的變數初始化為0
而2個new出來的空間均未被初始化
3、故養成自己初始化才是比較實在的
依靠編譯器的話哪天可能改了標準就容易出bug了
4、值得一提的是:new出來的空間並沒有訪問許可權的限制
只要知道其地址並且未被delete即可訪問。
例如:呼叫一個函式,並在裡面new出一連串空間,
再把首地址返回,則在該函式外依然可以訪問並使用這些空間
如圖中在text中new出來的空間在main函式中依然可以訪問,並不會隨著text()的結束而被銷燬
這同時也是新手容易產生的記憶體洩露,誤認為該記憶體空間會被回收。