Storage Allocator Issues
The debug version of the MFC runtime allocates storage differently than the
release version. In particular, the debug version allocates some space at the
beginning and end of each block of storage, so its allocation patterns are somewhat
different. The changes in storage allocation can cause problems to appear that
would not appear in the debug version--but almost always these are genuine problems,
as in bugs in your program, which somehow managed to not be detected in the debug
version. These are usually rare.
Why are they rare? Because the debug version of the MFC allocator initializes
all storage to really bogus values, so an attempt to use a chunk of storage that
you have failed to allocate will give you an immediate access fault in the debug
version. Furthermore, when a block of storage is freed, it is initialized to
another pattern, so that if you have retained any pointers to the storage and
try to use the block after it is freed you will also see some immediately bogus
behavior.
The debug allocator also checks the storage at the start and end of the block
it allocated to see if it has been damaged in any way. The typical problem is
that you have allocated a block of n values as an array and then accessed elements
0 through n, instead of 0 through n-1, thus overwriting the area at the end of
the array. This condition will cause an assertion failure most of the time. But
not all of the time. And this leads to a potential for failure.
Storage is allocated in quantized chunks, where the quantum is unspecified
but is something like 16, or 32 bytes. Thus, if you allocated a DWORD
array of six elements (size = 6 * sizeof(DWORD) bytes = 24 bytes) then
the allocator will actually deliver 32 bytes (one 32-byte quantum or two 16-byte
quanta). So if you write element [6] (the seventh element) you overwrite some
of the "dead space" and the error is not detected. But in the release
version, the quantum might be 8 bytes, and three 8-byte quanta would be allocated,
and writing the [6] element of the array would overwrite a part of the storage
allocator data structure that belongs to the next chunk. After that it is all
downhill. There error might not even show up until the program exits! You can
construct similar "boundary condition" situations for any size quantum.
Because the quantum size is the same for both versions of the allocator, but
the debug version of the allocator adds hidden space for its own purposes, you
will get different storage allocation patterns in debug and release mode.