作者LPH66 ((short)(-15074))
看板C_and_CPP
标题Re: [问题] 关於记忆体free.....
时间Thu Oct 22 19:34:27 2009
※ 引述《liu2007 (薯)》之铭言:
: 上课的时候
: 如果程式里有写到链节串列
: 老师都会叮咛我们要记得把所有节点free掉
: 要不然一直test程式会一直吃掉记忆体
: 除非重开机 reboot (我同学说的,不知对否....)
程式结束就会释放了
在你的 main 回传之後系统会做一些事帮你把这些还没还的还掉
(讲系统不太精准 应该是 C Runtime library 不过这里暂时不扯那麽多
你只要知道有人会帮你还就行了)
: 那麽我们使用int float char .........等等的变数呢?
: 为什麽不需要特别把它们free掉呢?
: 我自己猜是因为当run 结束之後IDE会自动把这些保留字型态的变数free掉
: 不知道对不对.....
不对...
这关乎於你的变数的存放位置是哪里来的
new / malloc 来的东西是在 heap 里面
而你平常宣告的区域变数则是在 stack 里
差别在於在 stack 里的变数离开函式就会自动不见
(要讲为什麽会自动不见就要扯更远 这里就打住)
而 heap 的则不会因为离开函式而不见
也因此需要你明确表示我现在不用了 (即 delete / free)
: 此外
: 我又想到
: 以後开发程式出来後并没有IDE
: 当程式关掉之後并没有东西帮我们free掉变数
: 请问是否要自己养成习惯
: 在程式结束後把所有变数free掉??
: 如果猜错的话就见笑了 Orz....
养成习惯是好的
刚刚说过如果都没还的话 会在你的程式结束时有人会帮你还
所以当你写了一个需要跑上好久的程式的话
这一点一点的 malloc 会把 heap 给吃光 吃光了就再也要不到空间了
这被称做 memory leak
--
"LPH" is for "Let Program Heal us"....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.84
1F:推 QQ29:L大我想问一下 global变数 所占的空间叫text segment吧 10/22 19:37
2F:→ QQ29:那他跟stack 是一起的嘛?我意思是说 global用多少会影响stack 10/22 19:37
3F:→ QQ29:剩多少可用嘛? 10/22 19:37
4F:→ nowar100:我以前学os的印象 global是放在data seg code才是放在 10/22 19:38
5F:→ LPH66:这个可能要深入到OS的记忆体配置了... 10/22 19:38
6F:→ LPH66:不过就我的经验是不会 10/22 19:39
7F:→ nowar100:text seg @@" 10/22 19:39
8F:→ LPH66:四楼这麽一说才想起来 global 是在 data/bss seg 没错 10/22 19:40
9F:推 QQ29:之前看推文说 char *="放在text seg" 其实是错的噜? 10/22 19:48
10F:→ QQ29:所以是 char*这个指标 和"这个字串" 都摆在data segment? 10/22 19:49
11F:→ QQ29:还有就是 text segment 所谓的放code code是 machine code嘛? 10/22 19:51
12F:→ MOONRAKER:当然是机械码,就算exe里有夹debug code也不会load进去 10/22 20:08
13F:推 greenmiracle:wiki写说data segment可能还会分读写和唯读两区 10/22 21:51
14F:→ greenmiracle:指标变数放在读写区,後面的字串放在唯独区 10/22 21:51
15F:→ greenmiracle:stack应该不在哪一个section,ms的linker预设把exe 10/22 21:51
16F:→ greenmiracle:的base address设成0x00400000,它的stack比这个位址 10/22 21:52
17F:→ greenmiracle:还低,而且grows down~~~~~有错请指教 10/22 21:52