Microsoft KB Archive/125309

= PRB: AllocMemoryDebug Gives Assertion or Trace Error on New[0] =

Article ID: 125309

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 1.0 Professional Edition

 Microsoft Visual C++ 1.5 Professional Edition

 Microsoft Visual C++ 1.51

 Microsoft Visual C++ 1.0 Professional Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q125309

<div class="symptoms_section">

SYMPTOMS
If new is called to allocate an array whose size is determined by a variable that has a value of zero (0), the program terminates with the following message in a debug build:

Assertion Failed! Windows Application:File Afxmem.cpp, Line

The value depends on the version of MFC that you have:


 * In MFC 2.0 = 275
 * In MFC 2.1 = 267
 * In MFC 2.5 = 277
 * In MFC 2.51 = 286

In MFC 3.x, the code generates a TRACE message similar to this:

Warning: Allocating zero length memory block.

<div class="resolution_section">

RESOLUTION
This behavior changed with the introduction of Visual C++ version 2.0. In the MFC that shipped with version 2.0, a TRACE is output to the Debug Window in Debug mode.

If you encounter the assertion failure, you can work around it by simply not calling new for a zero-length array. Check for a zero value before calling new. If you need to have a valid address for the memory block, allocate an array of size 1 as in new[1].

<div class="status_section">

STATUS
This behavior is by design. It is intended to help programmers detect logic errors in programs.

<div class="moreinformation_section">

MORE INFORMATION
The run-time operator new can be called with the argument zero. A distinct (non-null) pointer to an object will be returned. (See Section 5.3.3, third paragraph of the ARM - M.A.Ellis, B.Stroustrup.) This is the behavior of Visual C++ versions 2.x and 4.0. However, Visual C++ version 4.0 does not warn when new is called with a zero size. It is the programmer's responsibility to ensure the pointer returned by new is of the appropriate size.

Sample Code
/* Compile options needed: Default MFC App.

int size=0; char * p = new char[size];

// With MFC 2.51 or earlier, this causes an Assert to be thrown // With MFC 3.x this causes a TRACE warning

Additional query words: 1.00 1.50 2.00 2.10 2.50 2.51

Keywords: kbnoupdate kbprb KB125309

-

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

© Microsoft Corporation. All rights reserved.