在最近的一个项目中用到了MYSQL,前一段时间倒没有发现什么问题,直到今天发现了一个很奇怪的问题。
定义了一个数据库访问类:
class CMysql{
private:
MYSQL m_connectSQL;
string host;
string usr;
string password;
......
BOOL init();
}
在init()函数中调用mysql的库函数 mysql_init()(此函数即是将m_connectSQL的内存全置为0,而且还会初始化一些线程私有数据。 mysql_init()中通过调用my_thread_init(),来设置线程私有数据。
问题来了。
初始化 m_connectSQL时,发现类CMysql的一个实例的内存遭到了破坏,因为当我初始化 MYSQL类型的变量m_connectSQL时,还会将对象中的 host,usr,password成员的内存区也置为0。
百思不得其解,请教了一博士生学长后,还是不得其解,两人想出多种方案一一验证还是未能解决。为什么会发生内存覆盖或者说是重写呢?
忽然想到之前看到过的MYSQL结构体的定义,其中有一些成员是根据版本去定义的,如果是{头文件,lib文件(因为是静态链接的)}和dll 文件版本不一致,即,我使用的头文件和lib 文件版本较老,而dll 的版本较新,则会发生 实际调用的 mysql_init()函数会尝试初始化 MYSQL 结构体中 不存在的成员(因为在老版的头文件中未定义),所以,这时发生内存破坏是正常的!我立马比对两个版本,果然不一样!因为代码和DLL文件是放在一起由我在实验室拷贝回寝室的,而头文件和lib文件则是我笔记本上本来就有的,替换为对应的版本后,果然没有问题了! : )
发生这种未定义的行为竟然是由于版本不同造成的!
可见,在编程工作中,一定要细心啊!