作者ioioioioioio (讨战是兴趣)
看板C_and_CPP
标题[问题] 动态记忆体配置
时间Wed Sep 23 22:00:19 2009
请问一下喔
我配置动态记忆体後
a = (int* )malloc(sizeof(int) * 1);
b = (int* )malloc(sizeof(int) * 1);
c = (int* )malloc(sizeof(int) * 1);
经过编译後 执行至中断点b
指标分别为 a (0x....正常), c (0xcccccccc)
但是b的指标却是 0x00000000
不是应该要0x.....一些数字加英文 或是0xcccccccc吗??
谢谢各位啦~
--
◢████◣ 其实,我平常就像其他女孩子一样,静静的,很温柔……
★▃ ★▃ ╯
~●────●~
◢██████◣
██████
◥ ◤ ψRikakoWoods
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.149.100
1F:推 VictorTom:malloc回来的空间未初始化的话, 其内容值本来就没有一定 09/23 22:23
2F:→ VictorTom:是什麽; 0xcccccccc与0xcdcdcdcd是VC的debug模式会帮你 09/23 22:24
3F:→ VictorTom:偷填值, 印象中是用来找定义但未使用到的变数用的.... 09/23 22:24
4F:推 VictorTom:如果是malloc回来指标还是指在NULL, 那就是malloc失败. 09/23 22:28
5F:→ ioioioioioio:嗯嗯~ 我也觉得是malloc失败 那有啥解决办法吗?? 09/23 22:46
6F:→ ioioioioioio:我程式是做影像处理的 前半部用了很多配置记忆体 09/23 22:47
7F:→ ioioioioioio:这有关联吗?? 09/23 22:48
8F:推 VictorTom:去找找看IDE设定里有没有办法把Heap size调大点, BCB我 09/23 22:53
9F:→ VictorTom:记得就有; 再来就是研究一下是不是真的有必要用这麽多 09/23 22:53
10F:→ VictorTom:记忆体, 有没有可以重复用的, 有没有可以用较小空间型 09/23 22:54
11F:→ VictorTom:态的. 当然code里自己也要注意不要是自己写坏记忆体的. 09/23 22:55
12F:推 VictorTom:等等, 如果中断点设在b那行, 基本上它还没被执行到啊!? 09/23 22:58
13F:→ VictorTom:如果code一开始有init b为NULL, 那此时它是NULL很合理 09/23 22:59
14F:→ VictorTom:啊; (连续)记忆体不够是执行完b那一行以後b还是NULL. 09/23 23:00
15F:→ ioioioioioio:应该说已经执行完b那行了 但是指标仍是NULL 09/23 23:05
16F:→ ioioioioioio:我也刚试了FREE很多之前用的记忆体了 还是一样ㄟ 09/23 23:06
17F:→ ioioioioioio:好吧~我再找找看其他方法好了 谢谢你搂^^ 09/23 23:18
18F:推 QQ29:才配置一个不太可能爆炸吧? 要不要贴整段 09/23 23:25
19F:→ QQ29:那你先把a的那个改成*2 看可以配到嘛? 09/23 23:26
20F:→ VictorTom:我也觉得上面三行只是例子不是真的程式码, 另外一个怀 09/23 23:27
21F:→ VictorTom:疑的地方就是size那边最後算成0了, 才造成没配空间@_@" 09/23 23:27
情况是这样的
上面程式约有两千多行 是执行影像处理的
上面用过很多类似的宣告 result = (int* )malloc(sizeof(int) * m_size * n_size);
而且我有用中断点看过 m_size n_size 的值都是正确的
我本来想说是不是用太多malloc了 记忆体被吃光了
但是free很多之後 情况仍相同
我也试着把虚拟记忆体调大了 不过...Q_Q
※ 编辑: ioioioioioio 来自: 140.113.149.100 (09/23 23:34)
22F:→ VictorTom:除非你插的ram太少或系统/其他软体用太多, 不然调虚拟记 09/23 23:38
23F:→ VictorTom:忆体不会有任何帮助; 想看记忆体用量又没有工具, 最简单 09/23 23:39
24F:→ VictorTom:的方法就是工作管理员拉出来看, 如果看起来使用量并没有 09/23 23:40
25F:→ VictorTom:超过实际有的记忆体, 就先找找heap size去把它调大先. 09/23 23:40
26F:→ ioioioioioio:刚用工作管理员 记忆体吃362,108K 09/23 23:54
27F:→ ioioioioioio:那heap size要去哪调 我是用vc6 09/23 23:55
28F:→ VictorTom:吃到3xxM的记忆体!?那感觉就是heap爆了再也要不到了; 09/23 23:56
29F:→ VictorTom:heap/stack我只知道BCB6的调法, 待强者来解答吧XD 09/23 23:57
30F:推 QQ29:请教楼上 为啥heap 这样会爆 是系统有给每只程式上限嘛?? 09/23 23:57
31F:推 VictorTom:一个是你的编译环境就做的限制, 让你可以更有效的使用 09/23 23:59
32F:→ VictorTom:记忆体; 小弟我还没写到需要考虑系统给不给得了的程式XD 09/24 00:00
33F:推 QQ29:恩@@ 我以为只有stack大小会需要调整 以前调整过vc6的= = 09/24 00:05
34F:→ QQ29:而且我看他用掉顶多也才三百MB@@ 我刚刚自己用VC8 配置一G以 09/24 00:12
35F:→ QQ29:都OK....难道VC6那年代记忆体都没破G 所以限制很大嘛XD 09/24 00:13
36F:推 VictorTom:1998年发的开发工具嘛.... 09/24 00:23
37F:推 QQ29:那可以顺便问一下 之前听过的text segment这又算在哪里呢? 09/24 00:27
38F:→ QQ29:是算在heap嘛?? 还是怎麽算~ global 的东西都算在text seg吗? 09/24 00:28
39F:→ QQ29:那如果我再global写 int *p=new int[5566]; 这是配置在heap还 09/24 00:29
40F:→ QQ29:text@@ 对text没什麽观念 请多指教谢谢 09/24 00:29
42F:→ VictorTom:顺便一说, 你可以宣告global变数, 但是恐怕不能在 09/24 00:31
43F:→ VictorTom:global new吧....?? 09/24 00:31
44F:→ QQ29:可以阿直接初始 这是可以过得 不要分开写就ok 09/24 00:40
45F:推 VictorTom:原来还真的可以这样写Orz 不过这麽做只能开compile time 09/24 00:52
46F:→ QQ29:什麽是 开compile time@@ 09/24 00:53
47F:→ VictorTom:就知道大小的array不是吗?? 不过基本上应该不会在text 09/24 00:54
48F:→ VictorTom:区吧, wiki说这一区通常是放excutable code的啊XD 09/24 00:54
49F:→ VictorTom:Er~~我的推文被分开了........ XD 09/24 00:56
50F:→ FAITHY:请问这样会有什麽影响吗 譬如程式执行结果会如何 09/24 04:21
51F:→ WPC001:Win32都一样, allocate的上限是接近2GB 09/24 08:56
52F:→ WPC001:不会因为VC6而有差异的, 除非你特别设定了一些编译连结选项 09/24 08:57
53F:→ WPC001:try LocalAlloc() / LocalFree 09/24 08:59
54F:推 final01:WIN上heap有很多种 要用WIN API调整一下吧? 09/24 12:34
55F:→ final01:而且有工具可以监看使用记忆体吧 可以分析一下 09/24 12:35