120 likes | 203 Views
D: Memory Leak. 作問者 : @ epee_noir テスター : @Respect2D, @slip0110. …… ナニコレ?. 作問者の 怨嗟 思い付きによって作られた問題 コンセプト : うざい実装問題 文 字数 : 約 4800 文字 ( 本文のみ ) C 言語の malloc /free, ポインタ 風の構文を 解析する C- er は この辺に苦労した覚えがある はず 純 Java- er や低回生にはつらかったかもしれません ( すいません ……). 解答例. @Respect2D
E N D
D: Memory Leak 作問者: @epee_noir テスター: @Respect2D, @slip0110
……ナニコレ? • 作問者の怨嗟思い付きによって作られた問題 • コンセプト: うざい実装問題 • 文字数: 約4800文字(本文のみ) • C言語のmalloc/free, ポインタ風の構文を解析する • C-erはこの辺に苦労した覚えがあるはず • 純 Java-erや低回生にはつらかったかもしれません(すいません……)
解答例 • @Respect2D • 190行,3058 byte (C++) • @slip0110 • 305行, 7253 byte (Java)
A=malloc(10) malloc 残りのメモリ:100 → 90 10 A 参照 コピー clone B=clone(A) 残りのメモリ:90 → 80 10 10 A 参照 B 参照 free(A) free 残りのメモリ:80 → 90 10 A 参照 B 参照
残りのメモリ:90 10 A 参照 B 参照 A はまだ free された領域への参照を持っている! free(A) free 残りのメモリ:90 10 Error A 参照 B 参照 clone(A) clone 残りのメモリ:90 10 Error A 参照 B 参照
残りのメモリ:90 10 A 参照 B 参照 A はまだ free された領域への参照を持っている! C=A 残りのメモリ:90 10 A 参照 B 参照 C 参照 代入はOK
残りのメモリ:100 A 参照 B 参照 初期状態でも, 変数はどこかへの参照を持っている(かも) free(A) free 残りのメモリ:100 Error A 参照 B 参照 clone(A) clone 残りのメモリ:100 Error A 参照 B 参照
A=clone(clone(malloc(10))) malloc 残りのメモリ:100 → 90 10 コピー A=clone(clone(malloc(10))) clone 残りのメモリ:90 → 80 10 10 コピー clone A=clone(clone(malloc(10))) 残りのメモリ:80 → 70 10 10 10 これらの領域は参照されていない! A 参照
malloc free size size コピー clone size size
……ナニコレ? • 作問者の怨嗟思い付きによって作られた問題 • C-erには覚えがあるはず • 闇の軍団C++-erには怒られそう • 文字数: 約4800文字(本文のみ) • うざい系実装問題(やるだけ)