→ nh60211as: 你運氣好(不好) 04/01 21:57
推 LPH66: 就只是單純當時分給他的位置還沒人來而已 04/01 21:57
→ Lipraxde: 寫出 UB 就是爽,一直寫 UB 一直爽 04/01 21:58
undefined behavior?
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/01/2021 22:01:37
→ Lipraxde: 是 undefined behavior 沒錯,不過你這個例子,compile 04/01 22:37
→ Lipraxde: r 應該會報 warning / error 吧? 04/01 22:37
warning我沒仔細看明天確認一下, error當然是沒有的 不然就無法執行了
推 ando5566: 並沒有free掉 ,stack pointer 和base pointer回到上一 04/01 22:56
→ ando5566: 個function的狀態,你在callee之後宣蹷@個大的陣列即 04/01 22:56
→ ando5566: 可把stack memory洗掉。 04/01 22:56
這樣的話 那我想再請教一下關於解構式的意義了
我以為會跑解構式就已經是把這個物件準備從memory中移除了耶
以new的方式來看 用上面相同的程式碼
我如果寫
StructB *pB = new StructB;
delete pB;
在delete pB之後在VC裡面debug看m_nB的數值會是???? 表示無法存取的狀態
請問靜態宣告local變數跟動態new變數 在free跑完解構式的差異是?
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/01/2021 23:32:52
→ Lipraxde: 差別是放在 stack 上還說 heap 上 04/01 23:57
我懂了 您的意思是說在stack上的需要等這個stack被洗掉才會真正release是嗎?
→ Lipraxde: 如果有 address sanitizer 可以用的話開起來應該也可以 04/01 23:57
→ Lipraxde: 在執行時跳出錯誤 04/01 23:57
感恩 來去學一下 謝謝
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/02/2021 00:14:47
→ sarafciel: 嚴格說起來是你的rsp/rbp改掉的時候就算release了 04/02 00:19
→ sarafciel: 只是release不代表你的local variable值一定會改變 04/02 00:21
我想您的意思應該是說當rsp/rbp改掉的時機是指
local variable解構式跑完->stack回到上一層 這個階段
但這個stack在記憶體的位置並沒有被free掉 只是rsp/rbp改成上一層stack而已
所以我去存取這個local variable還能存取到他的數值
如果我想法是正確的 是否我改成這樣
void foo2() // 不做任何事
{}
int main()
{
StractA stA;
foo(stA);
foo2();
return 0;
}
是否這樣foo()的stack就會被洗掉了? stA.m_pB->m_nB 再也無法存取?
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/02/2021 00:37:31
推 b0920075: 有沒有洗掉不是很重要,就算他沒被洗掉你也不應該去用 04/02 00:33
→ b0920075: ,誰知道等下還會不會留著 04/02 00:33
我了解 只是我想知道compiler到底是偷做了甚麼事顛覆了我對變數lifecycle的認知這樣
我當然是不敢這樣去用上一個stack的local variable的.
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/02/2021 00:44:06
→ sarafciel: 你對free跟lifecycle消滅的定義是什麼呢? 04/02 01:52
→ sarafciel: 是執行期當你access這塊記憶體時 程式應該要報錯嗎? 04/02 01:53
是的 我以為lifecycle結束就跑解構式
已經跑過解構式的物件 在記憶體上就已經被刪除
既然被刪除就應該是無法存取了 我一直以為是這樣
→ Lipraxde: Compiler 沒偷做什麼,頂多說是偷懶沒把 stack 刷掉 04/02 02:31
→ a1u1usul3: 為什麼刪除的檔案還有機會找回來?因為剛好沒被洗掉。 04/02 04:14
→ a1u1usul3: 為什麼上一個function裡面local variable還在?因為剛 04/02 04:14
→ a1u1usul3: 好沒被洗掉 04/02 04:14
→ a1u1usul3: compiler沒有偷做什麼,他只是不再使用這個地方而已。 04/02 04:17
→ a1u1usul3: 既然已經不再使用這裡也就不用特地清成0了 04/02 04:17
原來如此 所以讀到那個1真的只是運氣好而已
推 ando5566: 先執行destructor ,再離開當下function (做stk /bsp re 04/02 08:17
→ ando5566: store) ,最後pop pc+1 與jump ;destruct內沒有清除data 04/02 08:17
→ ando5566: member的行為,對吧 04/02 08:17
推 LPH66: 或者應該反過來說, compiler 就是沒偷做什麼才會還能讓你 04/02 13:02
→ LPH66: 偷偷回去挖裡面原來放了些什麼東西 04/02 13:03
→ LPH66: ie.這裡沒照規矩做事的反而是程式去存取已經結束生命的變數 04/02 13:04
了解了 非常感謝以上各位的說明 讓小弟我又學到不少 謝謝!
※ 編輯: Keitaro (1.163.153.38 臺灣), 04/02/2021 13:45:36
推 unmolk: 在這串學到許多+1 謝謝板上各位大大! 04/03 03:43
推 steve1012: 特別去清掉會造成performance hit 沒甚麼必要 04/06 03:11