Microsoft KB Archive/122236

= PRB: Add Member Function Consuming Large Amount of Memory =

Article ID: 122236

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>

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

 Microsoft Visual C++ 4.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q122236

<div class="symptoms_section">

SYMPTOMS
After calling CStringArray::Add many times, unusually large amounts of memory become allocated to the application and not freed until the application terminates. This behaviour may be seen in the other array collection classes such as CObArray and CPtrArray as well.

<div class="cause_section">

CAUSE
Each time a call to Add is made, the array may grow. Memory needs to be allocated to accommodate the new size of the array. The array is copied to the new block of memory and the old memory is freed for re-use. The Visual C++ run-time heap allocator doesn't return freed memory to the system but instead marks the memory block as unused so that it can re-use the memory later.

For each call to Add that causes the array to be re-allocated, the old block is marked as unused. The sections marked as unused won't get re-used by the next call to Add because the array is too large to fit into the unused section. Other allocations (such as the CString) prevent adjacent free unused blocks of memory from being combined into a bigger block of unused memory.

<div class="resolution_section">

RESOLUTION
A developer using an array data structure typically knows the size of the array before allocating memory for it. However, if you don't know the size, you must re-allocate the array as it grows. This means that a new memory block must be allocated and the data from the old memory block must be copied to the new block before the old memory block is freed. This can cost time.

To work around the problem, call the member function SetSize with the approximate size of the array. If you are uncertain about the size of the array, minimize the amount of memory reallocations by specifying a larger size to allow room to grow. The first parameter to SetSize allows you to change the size of the array and the second parameter allows you to change the grow size. For example: CStringArray array; array.SetSize(100,100); Here the array will be allocated an original 100 elements. When the 100 elements have been used and Add is called for the 101st element, the array memory block will be reallocated to handle an additional 100 elements for a total of 200 elements.

Alternatively, SetSize(0, 100) would cause the initial size for the array to be zero and an Add would have to be done before any elements could be filled. This first Add in this scenario would cause 100 elements to be allocated for use by the array.

Additional query words: 1.00 1.50 1.51 2.00 2.10 2.50 3.00 4.00 fragment leak heap

Keywords: kbstring kbprb kbcollectionclass KB122236

-

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

© Microsoft Corporation. All rights reserved.