在C++/CLI中include atlstr.h头文件会导致_CrtIsValidHeapPointer异常

在VS2010 SP1的.NET应用程序中,当包含atlstr.h头文件并尝试使用CString转换System::String^到LPCTSTR时,会出现_CrtIsValidHeapPointer异常。为了避免这个问题,可以使用Marshal类的StringToHGlobalAuto方法转换,然后手动释放内存,如:IntPtr p = Marshal::StringToHGlobalAuto(_para); LPCTSTR temp = static_cast<LPCTSTR>(p.ToPointer()); DLLObj->Done(temp); Marshal::FreeHGlobal(p);

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

项目配置参数
IDE:VS2010+SP1
配置类型:.Net 应用程序(.exe)
MFC的使用:使用标准Windows库
ATL的使用:不使用ATL
字符集:使用Unicode字符集
公共语言运行时支持:公共语言运行时支持(/clr)

发现问题
调用了某个Win32的标准DLL,需要传入一个LPCTSTR,所以需要将System::String^转换为LPCTSTR,最简单的方法是通过CString,因为CString支持到LPCTSTR的隐式转换。代码如下:
void DoSth(String^ _para)
{
  CString temp(_para);
  DLLObj->Done(temp);
}
但为了不引用大量MFC内容,使用atlstr.h头文件,这里面有CString的定义。一旦包含了atlstr.h,则程序运行即报_CrtIsValidHeapPointer断言异常。
google、baidu、bing了个遍,也没找到可行的方案(可能是兄弟我水平有限,要是哪位朋友发现解决办法,别忘知会俺一声)。最后在微软的老窝发现一个类似的贴子,可惜不是问题贴,而是被当作Bug提交的,有兴趣的朋友可以点这里

替代方案
放弃包含atlstr.h头文件,即是说不通过CString实现String^→LPCTSTR的转换,用下面的方法也可以(说可以是因为目前还没发现什么问题 :-))
void DoSth(String^ _para)
{
  IntPtr p = Marshal::StringToHGlobalAuto(_para);
  LPCTSTR temp = static_cast<LPCTSTR>(p.ToPointer());
  DLLObj->Done(temp);
  Marshal::FreeHGlobal(p);  //这个一定要释放
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值