Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
win7c++;应用程序每次分配始终保留至少4k内存 我现在正在研究我写的C++应用程序的内存消耗问题(使用OpenGL的一个渲染引擎),并发现了一个非常不寻常的问题: 我基本上在系统中的任何地方都使用自己的分配器,这些分配器都是从默认分配器获得内存的,默认分配器使用malloc()/free()作为实际内存_C++_Memory_Memory Management - Fatal编程技术网

win7c++;应用程序每次分配始终保留至少4k内存 我现在正在研究我写的C++应用程序的内存消耗问题(使用OpenGL的一个渲染引擎),并发现了一个非常不寻常的问题: 我基本上在系统中的任何地方都使用自己的分配器,这些分配器都是从默认分配器获得内存的,默认分配器使用malloc()/free()作为实际内存

win7c++;应用程序每次分配始终保留至少4k内存 我现在正在研究我写的C++应用程序的内存消耗问题(使用OpenGL的一个渲染引擎),并发现了一个非常不寻常的问题: 我基本上在系统中的任何地方都使用自己的分配器,这些分配器都是从默认分配器获得内存的,默认分配器使用malloc()/free()作为实际内存,c++,memory,memory-management,C++,Memory,Memory Management,事实证明,我的应用程序总是通过malloc()为每次分配保留至少4096字节(我系统上的页面大小),即使大小要小得多。 malloc(8)甚至malloc(1)都会增加4096字节的内存。我直接在分配之前和之后,以及通过TaskManager(基本上显示相同的值)跟踪使用的内存大小。有趣的是,使用(ptr)返回指针的正确大小 我只能在我自己的应用程序中复制这个行为,用一个新的VS2012 C++项目测试它并没有产生同样的结果。这种行为似乎也与应用程序当前保留的大小无关,即使有超过10GB的空闲R

事实证明,我的应用程序总是通过malloc()为每次分配保留至少4096字节(我系统上的页面大小),即使大小要小得多。
malloc(8)
甚至
malloc(1)
都会增加4096字节的内存。我直接在分配之前和之后,以及通过TaskManager(基本上显示相同的值)跟踪使用的内存大小。有趣的是,使用
(ptr)
返回指针的正确大小

<>我只能在我自己的应用程序中复制这个行为,用一个新的VS2012 C++项目测试它并没有产生同样的结果。这种行为似乎也与应用程序当前保留的大小无关,即使有超过10GB的空闲RAM,它每次分配也至少保留4K


我对Windows操作系统的内部结构没有深入的了解(如果它与操作系统相关的话),所以如果有人知道是什么导致了这种行为,我将非常感谢

检查这个,它是从1993年开始的:-)


这并不意味着堆中可以分配的最小内存量是4096字节;相反,堆管理器根据需要提交内存页,以满足特定的分配请求。例如,如果应用程序通过调用GlobalAlloc分配100字节,堆管理器将在其提交区域内为此请求分配100字节的内存块。如果在请求时没有足够的提交内存可用,堆管理器只需提交另一个页面以使内存可用。

您可能正在使用“完整页面堆”运行。。。一种诊断模式,有助于更快地捕获代码中的内存访问错误。

这可以解释在多次分配后内存是否会增加4K,但在我的情况下,每次分配都会增加,甚至是多次后续的小分配,如'for(int i=0;i<100;i++)malloc(1)//“忽略泄漏”会增加约400K的内存消耗。文章提到了每次分配的一些开销,但它不应该是每分配1字节4K?这确实是答案,我忘记了我刚才为我的可执行文件配置了应用程序验证器。非常感谢:)