• 从__acrt_first_block == header 谈起,记录dll链接不一致的问题


               最近写了一个postgresql的数据库连接池dll。写的比较随意,某个头文件如下:

    #pragma once

    #include "common.h"
    #include "PgConnParam.h"
    #include <vector>

    namespace pgPool
    {
    class PGCONNPOOL_API CPgConnStmt
    {
    public:
    CPgConnStmt(ConnReqst* connRqst);
    ~CPgConnStmt();

    public:

    //by execute sql statement directly
    bool ExeStatement(std::string sql);

    //by by execute sql statement indirectly
    bool Create(std::string SqlString);
    bool BindParameter(CPgConnParam& param);
    bool ExeStatement();

    bool GetErrorMsg(std::string & msg);

    bool GetNext();
    bool GetFieldValue(const char* strFieldName, std::string &Val);
    //bool GetBlobValue(const char* strFieldName, std::string &Val); //postgresql 结果集无法返回同时是二进制和文本的内容
    bool GetFieldValue(const char* strFieldName, int &Val);
    bool GetFieldValue(const char* strFieldName, double &Val);

    long long GetAffectedRows();


    private:
    CPgConnStmt();
    void Free();
    private:
    PGresult *m_pResultSet;
    ConnReqst* m_connRqst;
    int m_row;
    int m_totalrow;
    std::string m_sql;
    std::vector<CPgConnParam> m_param;
    };

    }

    然后编译的话一堆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了。。

  • 相关阅读:
    设置允许跨域访问
    设计模式学习笔记(1)——单例模式
    yii2 request文件简介
    YII2 添加全局自定义函数
    第2章 查询基础
    第1章 数据库和SQL
    第0章 绪论
    用户贷款风险预测—特征提取
    用户贷款风险预测—数据探索
    Python 数据分析—画图
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/7444716.html
Copyright © 2020-2023  润新知