如何在Visual Studio中为我的应用程序分配所有可用内存?

我想在我的基于Windows的软件中渲染4百万个三角形,该软件是用Visual Studio C ++ 2010(在发布模式下构建)编写的。 当我渲染390万个三角形时,软件消耗的总RAM内存为400MB。 但是当我尝试渲染4百万个三角形(仅多100K)时,系统会给我一个错误。

For Example: Point *P = new (std::nothrow) Point[nb_triangles]; //==> "(std::nothrow)" is for catching the run time memory allocation error. (Point is X, Y, Z floats) If(P == NULL) message("System can't allocate this much memory."); // System gives me this error. It means the system can't reserve huge memory for this operation. 

我必须为顶点,面法线,顶点法线等分配内存。

其实我没有得到的是,我有8 GB RAM内存,(但在32位XP窗口= 3.2GB内存),软件只保留400MB,可用内存超过1 GB,但当我尝试只渲染100K三角形,它给了我一个错误。 为什么它给我一个错误? 因为它仍有超过1 GB的可用RAM内存?

无论如何要解决这个问题,如何为我的应用程序分配所有可用内存? 由于这个问题,我必须在软件中限制只是为了渲染390万个三角形,这并不好。

还有一个问题在于,c ++“new”运算符用于内存分配给我错误,c“malloc”运算符怎么样? 可以“malloc”解决这个问题,这两者之间有什么不同?

请指导我。 谢谢。

更新#1:

我已经尝试了很多,修改代码,删除内存泄漏等,但我不能分配超过4百万的内存。 它不可能将我的整个代码更改为“向量”。 我不能改成“向量”,我现在必须用“新”来坚持我自己的数据结构。 以下是我想分配以呈现1个对象的指针。

 P = new points[10000000]; // points is the class with 3 floats X, Y, Z; N = new Norm[10000000]; // Norm is the class with 3 floats X, Y, Z; V = new vNorm[10000000]; // vNorm is the class with 3 floats X, Y, Z; T = new Tri[10000000]; // Tri is the class with 3 integers v1, v2, v3; 

它是Windows编程的伟大神话之一,一个进程永远不会耗尽RAM。 Windows是一个按需分页的虚拟内存操作系统,如果一个进程需要更多的RAM,那么操作系统会通过分页其他进程拥有的其他内存页面来腾出空间。 或者流程本身,将页面交换掉一段时间没用过的页面。

任务管理器使用其默认设置报告进程的内存使用情况,这一点鼓舞了这一神话。 它显示了工作集 ,即RAM中进程的实际字节数。 一个值,通常远小于进程分配的虚拟内存量。 当OOM无法再分配虚拟内存时,进程就会在OOM上消失。 Taskmgr中的另一个统计信息,VM大小值。 而且它通常不会因为所有的VM被使用而死亡,但因为没有留下足够大的洞。 SysInternals的VMMap实用程序是查看进程如何使用其地址空间的好方法。

获得更大的虚拟内存地址空间需要进行相当彻底的改革。 虽然今天很容易,但只需将x64作为平台目标。 64位进程具有大量可用的地址空间,仅受页面文件的最大大小限制。 通过使用/ LARGEADDRESSAWARE链接器选项,只要您可以指望实际在64位操作系统上运行,您就可以在32位模式下跛行。 这样可以在64位操作系统上将VM大小从2 GB增加到4 GB。

对于其中一个问题:

is there any diffirence between these two?

new和malloc之间的区别如下:

  1. malloc用于C, malloc分配未初始化的内存。 分配的内存必须free

  2. new通过调用相应的构造函数初始化分配的内存。 分配有new内存应该与delete一起释放(调用析构函数)。 您不需要给出内存块的大小以释放分配的内存。

目前尚不清楚newmalloc是否根据标准相关(它取决于特定编译器是否使用malloc实现new ),因此只需用malloc替换new即可解决或不解决该问题。

从您显示的代码中,很难发现错误原因。 您可以尝试用vector替换动态数组,看看它是否能解决您的问题。 同时,您可以使用valgrind检查代码中是否有内存泄漏(如果您可以以某种方式将代码移植到带有makefile的Linux,因为很遗憾,valgrind在Windows上不可用)。

还有一个问题在于,c ++“new”运算符用于内存分配给我>错误,c“malloc”运算符怎么样? 可以“malloc”解决这个问题,这两者之间有什么不同吗?

mallocnew之间存在差异,例如, new会初始化你的内存并自动调用类的构造函数。 或者初始化它们是否是原始类型(例如floatintchar等)。 还应使用调用析构函数的delete关键字删除new分配的内存。

C的malloc()以及Visual Studio中的new运算符在内部调用HeapAlloc() 。 如果所需的内存太大,或者在进程之间共享, HeapAlloc()调用VirtualAlloc() 。 因此,它不一定能解决您的问题。 事实上,如果你使用C ++坚持使用new