在阅读https://dev.mysql.com/doc/refman/5.7/en/mysql-library-end.html后,我尝试在mysql_library_end()
完成查询后致电mysql_close()
。但是,当我需要再次查询时,在调用mysql_real_connect()
时出现分段错误。我所做的只是连接两次:
MYSQL *mysql;
mysql = mysql_init(NULL);
if (!mysql_real_connect(mysql, host, user, passwd, db, 3306, NULL, 0))
{
fprintf(stderr, "connect failed\n");
}
mysql_close(mysql);
mysql_library_end();
mysql = mysql_init(NULL);
if (!mysql_real_connect(mysql, host, user, passwd, db, 3306, NULL, 0)) // segmentation fault here
{
fprintf(stderr, "connect failed\n");
}
mysql_close(mysql);
mysql_library_end();
gdb backtrace:
#0 phtread_mutex_lock
#1 yaSSL::Sessions::lookup
#2 yaSSL::yaSSL_get_session
#3 ssl_do
#4 ssl_connect
#5 cli_establish_ssl
#6 mysql_real_connect
#7 main
如果我不打电话给mysql_library_end()
,程序运行良好但是valgrind说mysql_close()
之后仍然可以访问一些记忆。如何在没有内存泄漏的情况下修复程序?我的mysql版本是5.7.19。感谢您的光临和回复!
答案 0 :(得分:0)
有点"医生,医生,当我这样做时疼痛"问题 - 答案是不要调用mysql_library_end()。事实上,valgrind报告它在你完成之后仍然挂在一些内存上并不是一个错误 - 它只是意味着它分配了一些内存而它还没有释放它因为它还没有完成用它。
如果您调用mysql_library_end()后跟另一个mysql_init(),它可能不应该是段错误,但是手册页确实说您在使用完库后只调用mysql_library_end(),所以操作时在调用它之后尝试使用该库是未定义的。