我有一个使用大型数据数组的C++应用程序,并且在测试时已注意到内存不足,同时仍有大量可用内存.我已将代码缩减为示例测试用例,如下所示;
void MemTest()
{
size_t Size = 500*1024*1024; // 512mb
if (Size > _HEAP_MAXREQ)
TRACE("Invalid Size");
void * mem = malloc(Size);
if (mem == NULL)
TRACE("allocation failed");
}
Run Code Online (Sandbox Code Playgroud)
如果我创建一个新的MFC项目,包含此函数,并从InitInstance运行它,它在调试模式下工作正常(内存按预期分配),但在发布模式下失败(malloc返回NULL).单步执行释放到C运行时,我的函数内联我得到以下内容
// malloc.c
void * __cdecl _malloc_base (size_t size)
{
void *res = _nh_malloc_base(size, _newmode);
RTCCALLBACK(_RTC_Allocate_hook, (res, size, 0));
return res;
}
Run Code Online (Sandbox Code Playgroud)
调用_nh_malloc_base
void * __cdecl _nh_malloc_base (size_t size, int nhFlag)
{
void * pvReturn;
// validate size
if (size > _HEAP_MAXREQ)
return NULL;
'
'
Run Code Online (Sandbox Code Playgroud)
并且(size> _HEAP_MAXREQ)返回true,因此我的内存不会被分配.将大小放在手表上会显示512MB,这表明程序链接到一个不同的运行时库,并且具有更小的_HEAP_MAXREQ.为_HEAP_MAXREQ重写VC++文件夹会显示预期的0xFFFFFFE0,所以我无法弄清楚这里发生了什么.任何人都知道任何可能导致此问题的CRT更改或版本,或者我错过了哪些更明显的方法?
编辑:正如安德烈亚斯所建议的,在这个装配视图下看这个显示如下:
--- f:\vs70builds\3077\vc\crtbld\crt\src\malloc.c …
Run Code Online (Sandbox Code Playgroud) 在Visual C++中,如果我使用new在堆上创建一个对象,那么堆帧头和填充需要多少额外空间,特别是在发布代码中?我希望int可以说块中有多少可用空间,另一个可能是说当前正在使用多少空间,并且帧大小根据体系结构四舍五入到最接近的32位或64位.只是想知道VC++是否添加了保护字节,标志等额外的东西......并且帧大小四舍五入到更大的最小尺寸.换句话说,对于大量数据,在堆上使用大量小块数据是多么低效.
我正在编写一个泄漏内存(主内存)的程序来测试系统在低系统内存和交换内存时的行为方式.我们使用以下循环定期运行并泄漏内存
main(int argc, char* argv[] )
{
int arg_mem = argv[1];
while(1)
{
u_int_ptr =(unsigned int*) malloc(arg_mem * 1024 * 1024);
if( u_int_ptr == NULL )
printf("\n leakyapp Daemon FAILED due to insufficient available memory....");
sleep( arg_time );
}
}
Run Code Online (Sandbox Code Playgroud)
上面的循环运行一段时间并打印消息"leakyapp Daemon FAILED由于可用内存不足......".但是当我运行命令"free"时,我可以看到运行该程序对主内存或交换没有影响.
难道我做错了什么 ?