【发布时间】:2014-06-16 14:33:22
【问题描述】:
这是在 Windows XP 上,应用程序正在用 C++ (VS2010) 开发。
我希望我的应用程序继续分配内存,直到达到其限制而没有任何问题。但如果它分配整个 2GB(32 位 Windows 的最大限制),它会覆盖堆栈空间并最终崩溃。如何避免这种情况? (顺便说一句,我使用malloc 和new 进行内存分配)
在“Private Bytes”、“Virtual Bytes”和“Working Set”中,我相信我应该监控“Virtual Bytes”。但我对此并不完全确定。 (是“Virtual Bytes”还是“Private Bytes”当触及 2GB 时我们可以确定我们触及了限制?)
如果是“Virtual Bytes”我要监控,我不确定
_PROCESS_MEMORY_COUNTERS_EX的哪个字段反映了virtual bytes为了让应用程序安全流畅地运行,我应该保留多少内存? (只是堆栈大小 = 线程数 x 每个线程的堆栈大小 还是有更多的东西)
【问题讨论】:
-
你为什么要这样做?
-
检查 malloc 返回值(根据编译设置还有新的返回值)。 NULL(或异常)就是因为这个原因。你甚至不能仅仅因为你需要连续的空间而检查空闲内存。由于各种开销,计算并不那么直接。
-
你不应该把记忆放在一边。您应该根据需要分配内存,并注意并处理内存分配错误(malloc 在内存错误时返回 NULL)。
-
您确定不是您的应用程序代码在 malloc 开始失败时覆盖了您的堆栈?或者,也许是您正在使用的库?
-
如果分配失败,它不会覆盖堆栈...您只会得到 NULL(这可能会损坏应用程序或触发访问冲突)。堆栈溢出可能是由其他原因引起的(例如......当没有连续的可用内存块时,动态堆栈将无法增长)。
标签: c++ c memory memory-management