Microsoft KB Archive/132344

= FIX: App Terminates Unexpectedly after Windows NT 3.51 Upgrade =

Article ID: 132344

Article Last Modified on 10/24/2003

-

APPLIES TO

 The C Run-Time (CRT), when used with:  Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.1

 Microsoft Visual C++ 6.01 Professional Edition 

-

<div class="notice_section">

This article was previously published under Q132344

<div class="symptoms_section">

SYMPTOMS
After you upgrade to Windows NT version 3.51, malloc or other run-time memory allocation functions may fail when unable to grow the run-time library's heap.

Windows applications that are statically linked to the C run-time library and all console applications issue the error, "R6018 - Unexpected heap error," and terminate.

Windows-based applications which are linked to the DLL version of the C run- time library, and MFC applications will unexpectedly terminate with no error message. This termination may be preceded by a message saying that the system is low on resources and to close down some applications.

<div class="cause_section">

CAUSE
This problem is caused by a change in the return code from the VirtualAlloc function. It formerly returned ERROR_NOT_ENOUGH_MEMORY when it could not commit pages. Now it returns ERROR_COMMITMENT_LIMIT. The problem occurs only on Windows NT version 3.51 and only when the application hits its commit limit as chosen by Windows NT. This limit varies depending on such things as the size of the installed memory and the number of applications running. The sample code listed in this article causes the R6018 error when run on Windows NT version 3.51 but runs to completion under previous versions of Windows NT.

<div class="resolution_section">

RESOLUTION
The C Run-Time heap manager was changed in Visual C++ 4.0 to no longer use VirtualAlloc. Visual C++ version 4.0 correctly handles the ERROR_COMMITMENT_LIMIT case.

This problem can be worked-around in Visual C++ 2.X by allocating large blocks of memory using Win32 memory allocation APIs.

<div class="status_section">

STATUS
Microsoft has confirmed this to be a problem when using malloc on Windows NT version 3.51. This problem was corrected in Visual C++, 32-bit edition, version 4.0.

<div class="moreinformation_section">

Sample Code to Reproduce Problem
/* Compile options needed: none

void main
 * 1) include <stdlib.h>

{   void * p = malloc( 1024*1024*1024 ); // try to allocate 1GB if( p ) {       printf( "malloc returned non-NULL\r\n"); free(p); }   else printf( "malloc returned NULL\r\n"); }

Additional query words: 1.00 2.00 2.10 2.20 fatal error die shut down disappear

Keywords: kberrmsg kbbug kbfix kbcrt KB132344

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.