运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常

运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常

最近打算使用Google CTemplate作为模板引擎,但是运行其主页上的例子居然出现了错误。程序运行的结果正常,但是在退出时导致了_CrtIsValidHeapPointer异常,主要是释放string变量时出现了错误。搜索了一下Google CTemplate的讨论组,说如果编译库文件所使用的CRT版本和编译程序所使用的CRT版本不一致会导致这个问题。DLL库采用的CRT是多线程DLL方式的,所以应用程序也必须使用这个方式,这就需要在应用程序的工程选项中将CRT由默认的单线程方式改为多线程DLL方式。如下图所示。

运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常_第1张图片

 

不过这有时不太方便,也可以把CTemplate所需要的文件直接加到工程中,好在文件不多:

·                                 src\base\arena.cc

·                                 src\htmlparser\htmlparser.cc

·                                 src\htmlparser\jsparser.cc

·                                 src\windows\port.cc

·                                 src\htmlparser\statemachine.cc

·                                 src\template.cc

·                                 src\template_dictionary.cc

·                                 src\template_from_string.cc

·                                 src\template_modifiers.cc

·                                 src\template_namelist.cc

·                                 src\template_pathops.cc

记得在这些文件的编译属性中选择不使用预编译头,否则会出现编译错误。

 

clip_image003 2008 年8 月31 :以上介绍的是0.90版本,在0.91版本中src\template_from_string.cc 文件不存在了。

clip_image003  2008 年9 月15 :采用上面介绍的方法有个缺陷,就是会出现很多编译和链接的警告C4251LNK4049LNK4071。这主要是因为在CTemplate的代码中,定义了:

 

clip_image004clip_image005Code
#ifndef CTEMPLATE_DLL_DECL
# define CTEMPLATE_DLL_DECL  __declspec(dllimport)
#endif

所以需要在编译的命令行加上“/D CTEMPLATE_DLL_DECL=”

 

你可能感兴趣的:(运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常)