从__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 ...
随机推荐
- (七十四)iOS8之前使socket可以后台运行的方法
对于使用socket通信的应用程序,常常希望App位于后台时仍然可以进行网络通信,这在iOS8和以后的版本是被默认允许的,socket可以直接在后台运行,而对于iOS8之前的版本就不行,需要进行两步设 ...
- xml解析之sax解析原理图和技术介绍
SAX解析工具- Sun公司提供的.内置在jdk中.org.xml.sax.* 核心的API: SAXParser类: 用于读取和解析xml文件对象 parse(File f,DefaultHand ...
- Libgdx 1.5.4发布,跨平台游戏开发框架
(原文链接:http://www.libgdx.cn/topic/70/libgdx-1-5-4%E5%8F%91%E5%B8%83) [1.5.4] 添加对Titled maps 的图像层的支持. ...
- leetcode之 Palindrome Partitioning I&II
1 Palindrome Partitioning 问题来源:Palindrome Partitioning 该问题简单来说就是给定一个字符串,将字符串分成多个部分,满足每一部分都是回文串,请输出所有 ...
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...
- matlab学习日志之并行运算
原文地址:matlab并行计算,大家共同学习吧,涉及到大规模数据量处理的时候还是效果很好的 今天搞了一下matlab的并行计算,效果好的出乎我的意料. 本来CPU就是双核,不过以前一直注重算法,没注意 ...
- Emotiv脑电设备与RDS机器人仿真初步测试
Emotiv脑电设备与RDS机器人仿真初步测试 在脑电设备相关算法进行真实机器人测试前,有必要进行大量仿真验证算法,节约开发时间. 这里给我启发的Emotiv使用所参考的一些网址. 官网:https: ...
- Java 开源 CMS :magnolia
Magnolia 是一个开源基于Java的Web内容管理系统(CMS),构建在Java内容知识库标准(JSR-170).在使用它的过程中,我发现它的界面确实很有特色:给人一种Win8的感觉.在此记录一 ...
- 【Unity技巧】统一管理回调函数——观察者模式
这次的内容有点类似设计模式里的观察者模式.但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过. 开场白 我们来想象一个场景.在加载一 ...
- Material Design之CardView的使用
本文介绍CardView这个控件的使用,CardView继承至FrameLayout类,是support-v7包下的一个类,使用时必须引入cardview依赖包,可在下载的sdk文件夹中找到... 使 ...