vs2010的“运行库”选项对动态库堆的影响

最近在做一个项目,用到了json,IDE使用vs2010。

json用起来还算顺手,只是项目用到了多个动态库,而每个动态库都要用json,所以就想把json封装成一个单独的库供其它动态库来调用。

json文件本来是已做了这个编译选项的,所以只需要把json的文件加入到一个空的动态库工程中,并添加预定义 JSON_DLL_BUILD,然后编译即可得到json库(库名称是你自己建立的动态库,和普通的动态库没啥区别)。


使用json库也很简单,包含json.h,添加对应的lib文件,在包含json.h之前需要添加预定义 JSON_DLL。

这样就不用在每个工程中添加json的源文件来编译了。


完工之后,运行程序,发现程序挂掉,位置在dbgheap.c中:


extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
        const void * pUserData
        )
{
        if (!pUserData)
            return FALSE;

        if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
            return FALSE;

        return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}
错误被定位到了最后一行的HeapValidate()上。

上网上搜索无果。

后又建立一个测试工程,win32的,代码很简单,就是调用这个json库而已:

#define JSON_DLL
#include "jsonlib/json/json.h"
#pragma comment(lib, "mjsonlib.lib")

void TestFun()
{
	Json::Value jValue;
	jValue["test"] = 38;

	char bootnfo[32] = {0};
	DWORD dwTick = GetTickCount();
	dwTick /= 1000;
	sprintf( bootnfo, "%02d:%02d:%02d", dwTick/3600, dwTick%3600/60, dwTick%60 );
	jValue["systemboot"] = bootnfo;

	Json::FastWriter jWriter;
	std::string stel = jWriter.write(jValue);
	printf( "got json string=%s", stel.c_str() );
}

int _tmain(int argc, _TCHAR* argv[])
{
	TestFun();
	printf( "now tickcount=%u\n", GetTickCount() );
	system("pause");
	return 0;
}

运行该程序,结果成功直到退出也没有报错。感觉有点奇怪了。

由于我的json库是在其它动态库中使用的,所以又建立了一个测试动态库工程B,在B中导出一个函数fnjsondlldemo(),其中调用了json库的代码,内容同上面的TestFun()函数,然后在该_tmain()中调用B导出的函数fnjsondlldemo()。

编译运行,还是成功的。

这个方式和我的正式工程组织结构已经是一样的了,为什么我的工程不行,而这个测试工程没有问题?

我把这两个工程的属性打开,然后逐项对比。对比到“运行库”一项时不一样了,测试工程建立后没有做任何修改,而原始的工程为了不对msvcrp100.dll和msvcrt100.dll依赖,修改了该选项,debug的选项由“多线程调试 DLL (/MDd)”改成了“多线程调试 (/MTd)”,release的选项由“多线程 DLL (/MD)”改成了“多线程 (/MT)”。

后我把测试工程B也按照这个进行修改,结果一运行就发生了前面的那个堆错误。

原来是这个情况导致的,但至于这两个选项之间的差别,还没有研究过,不过从这里可以看出,msvcrx100.dll对不同的动态库使用了不同的堆。这也验证了刚开始的时候我在一个动态库中分配内存,然后再在另外一个动态库中删除时也报堆错误的问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值