读书人

系统剩下的内存超过4Grealloc大约10

发布时间: 2013-10-17 17:26:17 作者: rapoo

系统剩余的内存超过4G,realloc大约100多M内存还会失败吗?
程序中要进行大矩阵运算,很耗内存。当程序已经占用大约1.2G内存、系统剩余1G左右内存的时候,再进行运算,出现错误。发现是realloc大约100多M内存的时候,失败了。
我的配置:32位Windows,4G内存。编译器是VS2008。

换到另一台电脑,64位Windows,8G内存,仍然是在同一个地方出错。此时仍是realloc大约100多M内存,系统剩余的内存超过4G。

当没有足够多的连续的内存时,虽然总的内存够用,但realloc仍然会失败。但剩余的内存超过4G,realloc大约100多M内存还会失败吗?

网上查得realloc的用法,http://blog.csdn.net/hgj125073/article/details/8490163,讲的很详细,但并不能解决我的问题。
内存 realloc
[解决办法]
是不是其它地方导致出错了,你直接申请大内存看看
[解决办法]
我感觉你没明白realloc函数
realloc 有一个问题 你要知道就是它在realloc的时候 会出现连续空间不够的情况 之后把以前的申请的内存释放掉 在重新申请一片空间 所以你要用的是realloc的返回值 而不是说你realloc 它就会成功。
用realloc的时候一定要小心的检查。 在有就是你需要看C标准库是如何实现realloc 它的陷阱在哪。
[解决办法]
大块的内存要在程序开始的时候就申请,而且别释放。随着程序的运行过程中内存的不断申请和释放,内存可能被碎片化了,无法再申请出大块连续的内存
[解决办法]

引用:
Quote: 引用:

我感觉你没明白realloc函数
realloc 有一个问题 你要知道就是它在realloc的时候 会出现连续空间不够的情况 之后把以前的申请的内存释放掉 在重新申请一片空间 所以你要用的是realloc的返回值 而不是说你realloc 它就会成功。
用realloc的时候一定要小心的检查。 在有就是你需要看C标准库是如何实现realloc 它的陷阱在哪。

realloc返回结果是NULL。剩余4G内存,为什么还不够realloc 100多M的呢?

你不贴代码 是看不出问题的 你是不是连怎么用都写错了啊


[解决办法]
引用:
是的。我不明白的是,放到64位系统下,在剩余内存大于4G的情况下,为什么没有100多M的连续内存,来供realloc使用?
在64位系统下,你程序还是32位的啊,你程序指针最大值也就是0xFFFFFFFF,而系统又规定高2G保留系统使用,那么你最大寻址不就是0x7FFFFFFF么,你如何申请超过2G的内存?
[解决办法]
引用:
32位系统能寻址2^32B=4GB内存。但实际中,会有一些地址为其他地方所用。所以实际中,32位系统下,最大能利用3G多的内存。
默认2G-4G的内存是系统用的,驱动、系统内核在使用,你使用一个指针操作2G以上内存立马挂掉。并非程序是能用4G,你按照微软规定修改启动项最大用户才3G
[解决办法]
你得把程序编译为64位程序,才能使用大于2g以上内存。
[解决办法]
直接用系统调用分配页呢
[解决办法]
xp的话修改boot.int
multi(0)disk(0)rdisk(0)partition(4)\WINDOWS="Microsoft Windows XP Professional" /3GB /fastdetect
加上那个/3G 就可以

win7 的话要用 bcdedit.exe
BCDEdit /set increaseuserva 3072
[解决办法]
内存不够用的终极解决方法是:
用文件读写模拟内存读写
或者
直接用操作系统提供的内存映射文件API
[解决办法]
如果系统中没有那么大的连续内存空间, 分配失败也是正常的.

这就是常说的"内存碎片"问题. 虽然可用内存很多, 但是可能你想申请的那么大的连续内存却已经没有了.
[解决办法]
在64bits系统上,将程序也编译成64bits试试看。

一般来说64bits系统上运行64bits程序不会出现你的问题。

你的问题不是内存不够,而是应用程序空间不足了,根本问题是:程序是32bits的。
[解决办法]
楼主,建议分配失败的时候,打印一下系统返回的错误码。getlasterrorcode。看看具体原因。这样妄下结论是解决不了问题的。
[解决办法]
当然,你可以试着将你的程序编译成64位,再运行。我也怀疑可能是你的程序32位用不了大内存的问题。
[解决办法]
64位系统下, 打开 /LARGEADDRESSAWARE 选项, 32位程序可以使用4G内存, 应该够你用了..
最好还是编译成64位程序吧..

[解决办法]
使用HeapAlloc函数来实现内存分配
[解决办法]
引用:
Quote: 引用:

64位系统下, 打开 /LARGEADDRESSAWARE 选项, 32位程序可以使用4G内存, 应该够你用了..
最好还是编译成64位程序吧..

是的,编译成64位程序才是根本的解决之道。这个我正在尝试。请问,如何打开 /LARGEADDRESSAWARE 选项?


link选项加上就是了...
[解决办法]
引用:
大块的内存要在程序开始的时候就申请,而且别释放。随着程序的运行过程中内存的不断申请和释放,内存可能被碎片化了,无法再申请出大块连续的内存

++
程序启动的时候预分配一段大内存
[解决办法]
程序启动的时候,就把内存申请足够,然后就不要释放了,否则内存碎片化之后,很难再申请大块内存。

读书人网 >C语言

热点推荐