zoukankan      html  css  js  c++  java
  • 从__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了。。

  • 相关阅读:
    iOS开发基础-UITableView基本属性
    iOS开发基础-UITableView控件简单介绍
    iOS开发基础-UIScrollView实现图片缩放
    iOS开发基础-UIScrollView基础
    iOS开发基础-序列帧动画之Tom猫
    iOS开发基础-KVC简单介绍
    iOS开发基础-九宫格坐标(6)
    iOS开发基础-九宫格坐标(5)
    iOS开发基础-九宫格坐标(4)
    iOS开发基础-九宫格坐标(3)之Xib
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/7444716.html
Copyright © 2011-2022 走看看