Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用mysql\u close获取堆栈损坏,这是mysql中的错误吗?_C++_Mysql_Stack Corruption - Fatal编程技术网

C++ 调用mysql\u close获取堆栈损坏,这是mysql中的错误吗?

C++ 调用mysql\u close获取堆栈损坏,这是mysql中的错误吗?,c++,mysql,stack-corruption,C++,Mysql,Stack Corruption,我在Boost测试框架中调用此代码,该框架检查堆栈损坏 我收到以下错误消息: 运行时检查失败#2-变量“temp”周围的堆栈已损坏。我是否成功打开了与mysql数据库的连接并不重要。如果我对mysql\u close调用进行注释,我不会收到这样的消息 我安装了MySQL Server 5.6,并链接到以下目录: C:\Program Files\MySQL\MySQL Connector.C 6.1\lib C:\Program Files\MySQL\Connector.C++ 1.1\lib

我在Boost测试框架中调用此代码,该框架检查堆栈损坏

我收到以下错误消息: 运行时检查失败#2-变量“temp”周围的堆栈已损坏。我是否成功打开了与mysql数据库的连接并不重要。如果我对mysql\u close调用进行注释,我不会收到这样的消息

我安装了MySQL Server 5.6,并链接到以下目录:

C:\Program Files\MySQL\MySQL Connector.C 6.1\lib
C:\Program Files\MySQL\Connector.C++ 1.1\lib\opt
我正在使用我在这里找到的DLL运行:

C:\Program Files\MySQL\MySQL Connector.C 6.1\lib\libmysql.dll
我想知道调用约定是否错误,因为这是C++项目吗?解决这个问题的正确方法是什么?其他一切似乎都正常工作,我没有从任何其他mysql_uu调用中得到堆栈损坏

我有一个函数定义为:

void create_db(const std::string &host, const std::string &username, const std::string &password, const std::string &name)
{
    MYSQL temp;
    mysql_init(&temp);
    if (!mysql_real_connect(&temp, host.c_str(), username.c_str(), password.c_str(), NULL, 0, NULL, 0))
    {
        throw mysql_db::error(mysql_error(&temp), DETAILS, mysql_errno(&temp));
    }
    std::string query_str("CREATE DATABASE IF NOT EXISTS "+name);
    if (0 != mysql_real_query(&temp, query_str.c_str(), (unsigned long)query_str.length())) {
        mysql_close(&temp);
        throw database::error(mysql_error(&temp), DETAILS, mysql_errno(&temp));
    }
    mysql_close(&temp);
}
我可以注释掉所有内容以重现此问题,只留下:

void create_db(const std::string &host, const std::string &username, const std::string &password, const std::string &name)
    {
        MYSQL temp;
        mysql_init(&temp);
        mysql_close(&temp);
    }
MySQL\u close的MySQL文档内容如下:

20.6.7.5 mysql_close() void mysql\u close(mysql*mysql)

描述

关闭以前打开的连接。如果mysql_init()或mysql_connect()自动分配了mysql指向的连接句柄,则mysql_close()也会释放该句柄


所以我认为我可以在这里调用mysql\u close。

mysql库希望
mysql
指针是
malloc()在堆上分配的对象;
mysql\u close()
函数将尝试
free()
最后的指针。这对堆栈上的对象不起作用

您需要使用
malloc()
自己分配这个对象,或者允许
mysql\u init()
自己分配它,例如

MYSQL *temp = mysql_init(NULL);
...
mysql_free(temp);


您的代码是在调试模式下编译的吗?也许mysql库需要发布模式,或者有一个调试模式版本。所以这些例程中有两个bug和一个设计缺陷。内存分配应与mysql_init分开,内存释放应与mysql_close分开。但至少,当有人传入NULL和false时,mysql_init需要将mysql.free_me设置为true。mysql\u close然后需要实际检查mysql.free\u me,以确定它是否应该调用free。这些事情都没有发生。这迫使每个实现使用堆或遭受堆栈损坏。好吧,我对此提出了一个bug,他们向我保证它工作正常。所以,我开始思考我做了什么。因为我仍然怀疑电话会议有问题。这很复杂。我正在尝试创建一个包含MySQL和SQLite的C++库。我正在使用VisualStudio 2013。因此,由于运行库不同,我无法静态链接到MySQL。但是我的SQLite文件希望直接构建到代码中。所以它想要在一个静态库中。我想我把一个MySQL动态dll链接到了一个静态库中,并没有像我想象的那样定义CPPCONN_PUBLIC_FUNC=。我要么想办法用SQLite创建一个动态dll,要么我必须用VS2013构建MySQL库,这样我才能创建一个静态库。所以,这确实解决了问题,它完美地解释了问题。。。但文档中确实指出,如果由mysql_init或mysql_connect自动分配,它将取消分配句柄,在本例中,它不是。。。这意味着它会在内部用一个标志或其他东西来跟踪它。。。我想知道我是否可以对它调用memset来将内存归零,以避免出现这种情况。。。我认为它不应该试图释放它没有分配的东西。看起来是个糟糕的设计。但我衷心感谢你的回应。我只是觉得我也应该能够使用这个堆栈。我进一步研究了MYSQL结构,它确实有一个标记用于跟踪是否应该删除:my_bool free_me;/*如果在mysql中是免费的_close*/我还尝试了一个memset(&temp,0,sizeof(temp));在调用mysql_init(&temp)之前调用;它仍然试图删除堆栈上的MYSQL对象。这对我来说意味着mysql_init没有在有人将地址传递到mysql结构时正确地将该标志设置为false。所以,在调用mysql_close之前,我甚至尝试将该标志设置为false。。。mysql\u close仍然会删除堆栈上的结构。。。所以有两个bug。1.mysql\u init没有将temp.free\u me设置为false。2.mysql\u close在删除temp.free\u me之前没有检查它。老实说,mysql_close不应该试图删除任何内容。。。mysql_init不应该分配任何东西。这些操作应该与init和close分开。所以这基本上迫使我在不必要的时候使用指针和堆分配。它肯定没有像文档中描述的那样工作。有可能mysql\u init确实设置了该标志,因为mysql\u close甚至不需要检查它。。。但是应该检查一下以确保。。。我担心编写mysql_uu例程的人会选择潜在的堆栈损坏而不是潜在的内存泄漏。。。mysql\u init永远不会让我自由。当我传入NULL使其成为MYSQL的malloc实例时,它返回时所有内容都为零。这几乎就像有很多人在处理这段代码,他们对如何工作有不同的想法。我觉得这种事情很烦人。我是否需要围绕MySQL编写单元测试来验证它在其他地方是否也能正常工作?
MYSQL *temp = malloc(sizeof(MYSQL));
mysql_init(temp);
...
mysql_free(temp);