请问越界及GlobalMemoryStatus()的有关问题
请教越界及GlobalMemoryStatus()的问题!
在64位机器上运行的程序,按理说内存应该很难被申请完的吧,但是new的时候抛出了bad_allocation的错误,就按照网上说的使用了GlobalMemoryStatus()来获取剩余内存。结果发现还有大量空闲内存,而且通过任务管理器查看进程也只使用了300M左右,但是却new失败了(400w bytes内存);
怀疑GlobalMemoryStatus()使用的不对,于是写了个Test程序试了下,在new的前后分别获取剩余内存,结果发现申请比较大的内存的时候(比如100w bytes),剩余内存只减少了4096 bytes或者其他1024的整数倍,有时候new前后结果居然还是一样,反正没有正好等于new的长度的,请教这是什么原因?
还有64位机器上这种new失败的情况是不是一定就是越界导致堆栈被破坏了(虽然一次申请400w bytes,但是也就100多次左右)?或者是内存碎片?请教下谢谢!
------解决方案--------------------
印象中 windows 有内存使用的优化机制,new 以后并不立刻给你,只是做个记录,知道你有这个需求,真正需要访问这些内存的时候,才正式划拨呢。
400w bytes 不就是 4Mb 内存吗?这么点儿内存在现代机器上应该都没有问题,new 失败八成不是没有内存造成的,而是其他问题,比如关键数据结构损坏之类的,越界是可能造成类似问题的原因之一,具体问题还得看代码。
这个问题和 32 位或 64 位关系不大,地址宽度只控制可寻址内存理论总大小,真正的限制通常还是物理内存大小(此处忽略虚拟内存的问题)。比如某机器就有 1Gb 内存,你就是加载个 128 位的系统,也不会变出更多内存的。
------解决方案--------------------
内存总量400M不保证4M分配能成功。理论上如果进程的内存空间碎片得不能再碎片了,是会发生你描述的这种情况的。
但是内存碎片到连一块4M长度的连续内存都没有,这可能性也不大。先去排除其他情况吧。
------解决方案--------------------
如果出现了抛出bad_alloc这个异常,那就意味着内存耗尽,
或者有其他原因导致内存分配失败,
C++中的“new”还不只是分配内存那么简单。对于用户自定义的类型来说,“new T;”相当于operator new再加上对T的构造函数的调用。由于类的构造函数完全可能引发异常,于是,就算内存分配一切顺利,一条new语句还是可能产生异常。
建议搞个set_new_handler.它允许你设置一个在operator new和operator new[]分配内存失败时可以回调的函数
------解决方案--------------------
亲,内部类型也是有构造函数的,这个只是说明,new 操作不是只是分配一代你内存这么简单!
你还是搞个set_new_handler 吧!
------解决方案--------------------
如果是 std::bad_alloc 的异常,不会是构造函数引起的。
在64位机器上运行的程序,按理说内存应该很难被申请完的吧,但是new的时候抛出了bad_allocation的错误,就按照网上说的使用了GlobalMemoryStatus()来获取剩余内存。结果发现还有大量空闲内存,而且通过任务管理器查看进程也只使用了300M左右,但是却new失败了(400w bytes内存);
怀疑GlobalMemoryStatus()使用的不对,于是写了个Test程序试了下,在new的前后分别获取剩余内存,结果发现申请比较大的内存的时候(比如100w bytes),剩余内存只减少了4096 bytes或者其他1024的整数倍,有时候new前后结果居然还是一样,反正没有正好等于new的长度的,请教这是什么原因?
还有64位机器上这种new失败的情况是不是一定就是越界导致堆栈被破坏了(虽然一次申请400w bytes,但是也就100多次左右)?或者是内存碎片?请教下谢谢!
内存 越界 堆栈
64位
管理
栈
内存
------解决方案--------------------
印象中 windows 有内存使用的优化机制,new 以后并不立刻给你,只是做个记录,知道你有这个需求,真正需要访问这些内存的时候,才正式划拨呢。
400w bytes 不就是 4Mb 内存吗?这么点儿内存在现代机器上应该都没有问题,new 失败八成不是没有内存造成的,而是其他问题,比如关键数据结构损坏之类的,越界是可能造成类似问题的原因之一,具体问题还得看代码。
这个问题和 32 位或 64 位关系不大,地址宽度只控制可寻址内存理论总大小,真正的限制通常还是物理内存大小(此处忽略虚拟内存的问题)。比如某机器就有 1Gb 内存,你就是加载个 128 位的系统,也不会变出更多内存的。
------解决方案--------------------
内存总量400M不保证4M分配能成功。理论上如果进程的内存空间碎片得不能再碎片了,是会发生你描述的这种情况的。
但是内存碎片到连一块4M长度的连续内存都没有,这可能性也不大。先去排除其他情况吧。
------解决方案--------------------
如果出现了抛出bad_alloc这个异常,那就意味着内存耗尽,
或者有其他原因导致内存分配失败,
C++中的“new”还不只是分配内存那么简单。对于用户自定义的类型来说,“new T;”相当于operator new再加上对T的构造函数的调用。由于类的构造函数完全可能引发异常,于是,就算内存分配一切顺利,一条new语句还是可能产生异常。
建议搞个set_new_handler.它允许你设置一个在operator new和operator new[]分配内存失败时可以回调的函数
------解决方案--------------------
亲,内部类型也是有构造函数的,这个只是说明,new 操作不是只是分配一代你内存这么简单!
你还是搞个set_new_handler 吧!
------解决方案--------------------
如果是 std::bad_alloc 的异常,不会是构造函数引起的。