PRB: Data Corruption with LBS_SORT and CCheckListBox on Win32s (151030)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 2.0
- Microsoft Visual C++, 32-bit Editions 2.1
- Microsoft Visual C++, 32-bit Editions 2.2
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.1
This article was previously published under Q151030 SYMPTOMS
A CCheckListBox with the LBS_SORT style incorrectly copies the item data.
Different strings in the listbox point to the same item data object. In
debug mode using Visual C++ 4.0 and 4.1, this behavior will ASSERT in
DBGHEAP.C as _free_dbg() is called on the same memory block multiple times.
This is only a problem in Win32s.
CAUSE
This is a problem in Win32s with owner-draw listboxes that have the
LBS_HASSTRINGS and LBS_SORT listbox styles. CCheckListBox is an owner-draw
listbox that uses LBS_OWNERDRAWFIXED or LBS_OWNERDRAWVARIABLE with
LBS_HASSTRINGS. CCheckListBox uses the item data to maintain the check
state information for each item.
RESOLUTION
To work around this behavior, avoid the LBS_SORT style or use
InsertString() instead of AddString(). InsertString() does not cause a
LBS_SORT list to be sorted.
If the listbox needs to be sorted, the strings should be sorted before
being added to the listbox or the strings should be inserted in order.
STATUS
This behavior is by design.
Modification Type: | Major | Last Reviewed: | 10/24/2003 |
---|
Keywords: | kbCtrl kbListBox kbprb KB151030 |
---|
|