_CrtIsValidHeapPointer(pUserData) - why is this code broken. (vs2008)

EDN Admin

Well-known member
Joined
Aug 7, 2010
Messages
12,794
Location
In the Machine
<p align=left><font face=Arial size=2>Ive created two projects in a fresh solution using Microsoft Visual C++ 2008 (Not Express).</font>
<p align=left> 
<p align=left>1. testui (managed Windows Forms Application /clr /MDd) (from the CLR Windows Forms Application template)
<p align=left>2. testlib (unmanaged static library /MDd) (from the Empty Project template)
<p align=left> 
<p align=left>The testui application is unmodified but is made to depend on the testlib.  It has had its driver modified as follows:
<p align=left>  <font color="#008000" size=2><font color="#008000" size=2>
// testui.cpp : main project file. </font></font><font color="#0000ff" size=2><font color="#0000ff" size=2>
#include</font></font><font size=2> </font><font color="#a31515" size=2><font color="#a31515" size=2>"stdafx.h" </font></font><font color="#0000ff" size=2><font color="#0000ff" size=2>
#include</font></font><font size=2> </font><font color="#a31515" size=2><font color="#a31515" size=2>"Form1.h" </font></font><font color="#0000ff" size=2><font color="#0000ff" size=2>
#include</font></font><font size=2> </font><font color="#a31515" size=2><font color="#a31515" size=2>"Test.h" </font></font><font color="#0000ff" size=2><font color="#0000ff" size=2>
using</font></font><font size=2> </font><font color="#0000ff" size=2><font color="#0000ff" size=2>namespace</font></font><font size=2> testui;
[STAThreadAttribute] </font><font color="#0000ff" size=2><font color="#0000ff" size=2>
int</font></font><font size=2> main(</font><font color="#0000ff" size=2><font color="#0000ff" size=2>array</font></font><font size=2><System:<img height=19 alt="Tongue Tied" src="http://forums.microsoft.com/MSDN/emoticons/emotion-7.gif" width=19>tring ^> ^args)
{
Test t;
</font><font color="#008000" size=2><font color="#008000" size=2>// Enabling Windows XP visual effects before any controls are created </font></font><font size=2>
Application::EnableVisualStyles();
Application:<img height=19 alt="Tongue Tied" src="http://forums.microsoft.com/MSDN/emoticons/emotion-7.gif" width=19>etCompatibleTextRenderingDefault(</font><font color="#0000ff" size=2><font color="#0000ff" size=2>false</font></font><font size=2>);
</font><font color="#008000" size=2><font color="#008000" size=2>// Create the main window and run it </font></font><font size=2>
Application::Run(</font><font color="#0000ff" size=2><font color="#0000ff" size=2>gcnew</font></font><font size=2> Form1());
</font><font color="#0000ff" size=2><font color="#0000ff" size=2>return</font></font><font size=2> 0;
}
 
<p align=left>Basically identical to the template, just we #include "Test.h" and create Test t;
<p align=left> 
<p align=left>The testlib static library contains only one class as follows.
<p align=left> 
<p align=left>// Test.h <font color="#0000ff" size=2><font color="#0000ff" size=2>
#include</font></font><font size=2> </font><font color="#a31515" size=2><font color="#a31515" size=2><vector> </font></font><font color="#0000ff" size=2><font color="#0000ff" size=2>
class</font></font><font size=2> Test
{
</font><font color="#0000ff" size=2><font color="#0000ff" size=2>public</font></font><font size=2>:
Test(</font><font color="#0000ff" size=2><font color="#0000ff" size=2>void</font></font><font size=2>);
</font><font color="#0000ff" size=2><font color="#0000ff" size=2>private</font></font><font size=2>:
</font><font color="#0000ff" size=2><font color="#0000ff" size=2>static</font></font><font size=2> std::vector<</font><font color="#0000ff" size=2><font color="#0000ff" size=2>void</font></font><font size=2> *> testvec;
};
 
<p align=left>// Test.cpp <font color="#0000ff" size=2><font color="#0000ff" size=2>
#include</font></font><font size=2> </font><font color="#a31515" size=2><font color="#a31515" size=2>"Test.h" </font></font><font size=2>
std::vector<</font><font color="#0000ff" size=2><font color="#0000ff" size=2>void</font></font><font size=2> *> Test::testvec;
Test::Test()
{
}
 
<p align=left>When I run this program it fails with a Debug Assertion Failed! Expression: _CrtIsValidHeapPointer(pUserData) which of course is raised from <font size=2>_ASSERTE(_CrtIsValidHeapPointer(pUserData)); in dbgheap.c</font>
<p align=left><font size=2></font> 
<p align=left><font size=2>Why does this happen? && How do I fix this?  I developed this test case because it is occurring with a very large static library that uses a lot of stl based static member data similar to this test case.  Anyway, for completeness I have attached the output produced by vs2008 when it fails.</font>
<p align=left> 
<p align=left>Any help would be greately appreciated.
<p align=left> 
<p align=left>Thanks
<p align=left>  <font size=1>
testui.exe: Loaded C:Documents and SettingsDevelDesktoptreestesttestuiDebugtestui.exe, Symbols loaded.
testui.exe: Loaded C:WINDOWSsystem32ntdll.dll
testui.exe: Loaded C:WINDOWSsystem32mscoree.dll
testui.exe: Loaded C:WINDOWSsystem32kernel32.dll
testui.exe: Loaded C:WINDOWSsystem32advapi32.dll
testui.exe: Loaded C:WINDOWSsystem32rpcrt4.dll
testui.exe: Loaded C:WINDOWSsystem32secur32.dll
testui.exe: Loaded C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcr90d.dll, Symbols loaded.
testui.exe: Loaded C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcp90d.dll, Symbols loaded.
testui.exe: Loaded C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcm90d.dll, Symbols loaded.
testui.exe: Loaded C:WINDOWSsystem32ole32.dll
testui.exe: Loaded C:WINDOWSsystem32gdi32.dll
testui.exe: Loaded C:WINDOWSsystem32user32.dll
testui.exe: Loaded C:WINDOWSsystem32msvcrt.dll
testui.exe: Loaded C:WINDOWSsystem32imm32.dll
testui.exe: Loaded C:WINDOWSsystem32shlwapi.dll
testui.exe: Loaded C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscorwks.dll
testui.exe: Loaded C:WINDOWSWinSxSx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.1433_x-ww_5cf844d2msvcr80.dll
testui.exe: Loaded C:WINDOWSsystem32shell32.dll
testui.exe: Loaded C:WINDOWSWinSxSx86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83comctl32.dll
testui.exe: Loaded C:WINDOWSsystem32comctl32.dll
testui.exe: Loaded C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Culture.dll
testui.exe: Unloaded C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Culture.dll
testui.exe: Loaded C:WINDOWSassemblyNativeImages_v2.0.50727_32mscorlib32e6f703c114f3a971cbe706586e3655mscorlib.ni.dll
testui.exe (Managed): Loaded C:WINDOWSassemblyGAC_32mscorlib2.0.0.0__b77a5c561934e089mscorlib.dll
testui.exe: Loaded C:WINDOWSsystem32uxtheme.dll
testui.exe: Loaded C:WINDOWSsystem32msctf.dll
testui.exe (Managed): Loaded c:Documents and SettingsDevelDesktoptreestesttestuiDebugtestui.exe, Symbols loaded.
testui.exe: Loaded C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscorjit.dll
testui.exe: Loaded C:WINDOWSMicrosoft.NETFrameworkv2.0.50727diasymreader.dll
testui.exe: Loaded C:WINDOWSsystem32rsaenh.dll
testui.exe (Managed): Loaded C:WINDOWSWinSxSx86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456msvcm90d.dll, Symbols loaded.
testui.exe: Loaded C:WINDOWSassemblyNativeImages_v2.0.50727_32Systemba0e3a22211ba7343e0116b051f2965aSystem.ni.dll
testui.exe (Managed): Loaded C:WINDOWSassemblyGAC_MSILSystem2.0.0.0__b77a5c561934e089System.dll
First-chance exception at 0x7c96c540 in testui.exe: 0xC0000005: Access violation reading location 0x23e7ad1a.
testui.exe: Loaded C:WINDOWSsystem32version.dll
testui.exe: Unloaded C:WINDOWSsystem32version.dll
testui.exe: Loaded C:WINDOWSsystem32msctfime.ime
testui.exe has triggered a breakpoint
The program [0x184] testui.exe: Managed has exited with code 0 (0x0).
The program [0x184] testui.exe: Native has exited with code 0 (0x0). </font>
<p align=left> 
<p align=left></font></font></font> 

View the full article
 
Back
Top