从__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了。。
最新文章
- 深入理解android:id以及@+id/name和@id/name的区别联系
- 文本溢出省略解决笔记css
- 配置本地光盘为yum源
- ASP.NET获取客户端IP/用户名等信息
- C#中关键字ref修饰类对象或结构体[转]
- 数值的整数次方(剑指offer面试题11)
- OpenCV+QT开发环境(一):Windows环境
- homework-06-C++11
- C++学习之路—运算符重载(一)概念、方法及规则
- vm_write
- (0)写给Web初学者的教案-----Web基础
- 基于Entity Framework的自定义分页,增删改的通用实现
- Kafka的partions和replication-factor参数的理解
- 阿里云上rabbitmq安装
- Affiliate实战记录之一:CPI、CPA、CPM...名词解释
- Mysql中use一个表出现警告:Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A
- 自学Linux Shell8.1-linux文件系统概述及操作
- django 1.9.7 css控制模板样式
- WPF中自定义路由事件
- WP8.1学习系列(第十九章)——事件和路由事件概述
热门文章
- 手把手教你轻松实现listview上拉加载
- 1033. To Fill or Not to Fill (25) -贪心算法
- 02_Android写xml文件和读xml文件
- python字典作为统计记录工具
- MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决办法
- 【Qt编程】Qt学习之窗口间的相互切换
- JNI设置C++与java的结合(2)
- 栈的顺序存储 - 设计与实现 - API实现
- git remote
- Linux内核通用队列的使用笔记(读linux内核设计与实现)