从__acrt_first_block == header 谈起,记录dll链接不一致的问题
最近写了一个postgresql的数据库连接池dll。写的比较随意,某个头文件如下:
|
#pragma once #include "common.h" namespace pgPool public: //by execute sql statement directly bool GetErrorMsg(std::string & msg); bool GetNext(); long long GetAffectedRows(); private: } |
然后编译的话一堆warning

这个warning的原因我是知道的,就是std的东西都是模板实现的,包含头文件的时候包含了模板类。对于不同的编译环境,如vs2008与vs2015,std的实现方式可能不一致,就导致使用这个dll的模块可能会有dll链接不一致的风险。
最好的规避方法是使用pImp模式,把std的细节包含在实现内,不要暴露给使用方。项目比较紧并且已经有人使用了,目前还没改成正规的方式。
只要确保vs的编译环境一致,目前还是可以用的。
然后就踩到了另外一个坑,编译没问题,调试的时候莫名其妙报了“__acrt_first_block == heade”的窗体。
出错的地方在“bool Create(std::string SqlString)的函数结束处”
问题的原因是 模块间一定要遵守“谁new谁delete的原则”,使用DLL的时候,问题可能在于不同的堆用于分配和释放 引起的。
改为bool Create(std::string& SqlString) 后解决。
切记,编译器的warning还是要重视的,以后写dll,一定不要把std的东西暴露给用户!
2017-9-5更新:
运行不久后还是报错了,原因在于string传入的时候如果长度不够,会在dll模块进行realloc,然后会造成不同模块之间new与delete。
解决办法,编译成静态库或者不要使用dll了。。
从__acrt_first_block == header 谈起,记录dll链接不一致的问题的更多相关文章
- opencv 3.2 vs2015 debug assertion __acrt_first_block == header
网上复制了一个转直方图的代码 ,说来也奇怪, 用imshow 显示 图片在独立窗体内,不存在问题, 要注释掉这段代码就出现了下边的错误. 网上查了查,原来是程序中 有个std::vector<c ...
- 小心DLL链接静态库时的内存错误
本文转自http://www.bennychen.cn/2010/09/%E5%B0%8F%E5%BF%83dll%E9%93%BE%E6%8E%A5%E9%9D%99%E6%80%81%E5%BA% ...
- Expression: __acrt_first_block == header
File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp Line: 996 Expression: __acrt_first_block == ...
- 使用code::blocks编译windows的dll链接库
因为机子上没有安装Visual Studio,所以找到了一种通过code::blocks编译dll的方式,踩到的坑是code::blocks默认的compiler是32位的,这样编译出的dll也是32 ...
- DLL链接库
转载请注明来源:https://www.cnblogs.com/hookjc/ 2. 静态链接库 对静态链接库的讲解不是本文的重点,但是在具体讲解 DLL 之前,通过一个静态链接库的例子可以快速地帮助 ...
- php大力力 [035节] 先记录一些链接
[IT名人堂]专访百分点研发总监:不止于平台,大数据操作系统重磅来袭! [2015-8-11 14:17:04] [IT名人堂]专访1号店技术总监:大型电商网站的IT架构 [2015-8-25 15: ...
- C++ 出现异常“.... \debug_heap.cpp Line:980 Expression:__acrt_first_block==header"
本人是在写dll项目中出现了这个问题,经过一天的研究,尝试了三个步骤1.在配置属性->常规->MFC的使用中,将在静态库中使用MFC改为在共享DLL中使用MFC.但是还会出错2.原因是dl ...
- 发布Mvc 项目 mvc.dll版本号不一致 出现 3.0.0.1 和4.0.0.1的解决方案
部署Mvc 项目的时候,很可能出现以下情况的提示: System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856a ...
- 关于NewJson dll 引用不一致
{System.IO.FileLoadException: 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKe ...
随机推荐
- 上海C++游戏服务器群活动PPT下载
下载页面: http://download.csdn.net/download/jq0123/8227519 跨服与跨区的设计PPT 上海C++游戏服务器群 2014.11.9 沙龙讲义. 自我介绍 ...
- ROS_Kinetic_05 ROS基础内容(二)
ROS_Kinetic_05 ROS基础内容(二) 1. ROS节点node 官网教程:http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingNodes ...
- Demand Side Platform
DSP特点: DSP不是从网络媒体那里包买广告位,也不是采用CPD(Cost Per Day)的方式获得广告位:而是从广告交易平台(AdExchange)来通过实时竞价的方式获得对广告进行曝光的机会, ...
- PA模块常用表
SELECT * FROM pa_projects_all; --项目 SELECT * FROM pa_project_types; --项目类型 SELECT * FROM pa_project_ ...
- 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧
http://blog.csdn.net/pipisorry/article/details/49052255 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 【一天一道LeetCode】#58. Length of Last Word
一天一道LeetCode系列 (一)题目 Given a string s consists of upper/lower-case alphabets and empty space charact ...
- python的map
map(function, iterable, ...) 将function放到迭代的每个元素执行,结果为list. 引自>:http://my.oschina.net/zyzzy/blog/1 ...
- 《java入门第一季》之面向对象(修饰符的概念和总结)
还是由于eclipde等ide的强大功能,会自动提示你修饰符是否可行.所以对修饰符的作用了解即可: 修饰符: 权限修饰符:private,默认的,protected,public ...
- 【Android 应用开发】 Ubuntu 安装 Android Studio (旧版本|仅作参考)
. 果断换Ubuntu了, Ubuntu的截图效果不好, 不能设置阴影 ... 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article ...
- android的Binder通信机制java层浅谈-android学习之旅(88)
1.Service Manager的Java代理对象 在Java层中,Service Manager的代理对象类型为ServiceManagerProxy.它继承并且实现了IServiceManage ...