【问题标题】:MySQL Connector C++ - Invalid PointerMySQL 连接器 C++ - 无效的指针
【发布时间】:2012-04-13 21:50:40
【问题描述】:

我正在尝试使用 MySQL C++ 连接器连接到数据库。我已经添加了库,并且源代码使用所有必要的#include 语句正确编译。我使用的代码如下:

#include <stdlib.h>
#include <iostream>

#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

using namespace std;

int main(void)
{
    using namespace sql;

    Driver *driver;
    Connection *con;

driver = get_driver_instance();
con = driver -> connect("tcp://127.0.0.1:3306/test", "test", "test");
}

代码直接取自示例,应该可以正常工作。我已经显着缩短了代码,因为它位于引发错误的最终“驱动程序 - > 连接”行。我的错误信息如下:

*** glibc detected *** /home/username/NetBeansProjects/mysql/dist/Release/GNU-Linux-x86/mysql:
free(): invalid pointer: 0x091dd468 ***

我在 Linux Mint Lisa 上,运行最新版本的 MySQL 并使用 NetBeans 7.1 作为 IDE。如前所述,代码编译正确,并且发生在最后一条连接线上。对于其他连接机制的任何帮助或建议将不胜感激。


更新

这是定义连接的 Driver 类中的代码

class CPPCONN_PUBLIC_FUNC Driver
{
protected:
virtual ~Driver() {}
public:
// Attempts to make a database connection to the given URL.

virtual Connection * connect(const sql::SQLString& hostName, const sql::SQLString& userName, const sql::SQLString& password) = 0;

virtual Connection * connect(ConnectOptionsMap & options) = 0;

...

那里没什么可看的……以我的拙见……

【问题讨论】:

  • 看起来好像一些内存已被释放,然后尝试再次释放,但由于不再分配而失败。无法从您发布的代码中真正分辨出来,您可以发布其余的吗?还是放一个示例代码的链接?
  • 这就是所有的代码!我将使用驱动程序 -> 连接功能从页面发布代码,但这直接来自 MySQL 连接器开发团队,所以我怀疑它会包含错误:/.
  • get_driver_instance 是您的代码还是连接器的一部分?如果是你的,请张贴那个
  • 连接器,但如果你愿意,我可以发布它。我这里没有写任何代码。我截断了 MySQL 网站上的一个 hello world 程序,仅此而已。我在网上找到了一些关于 Boost 库冲突的信息,但这似乎不适用于我这里......
  • get_driver_instance() 返回一个指针,因此该值可以为 null,这是您应该检查的内容。

标签: c++ mysql mysql-connector


【解决方案1】:

我已经为 Ubuntu 12.04 找到了解决这个问题的方法,我花了大约 48 小时没有睡觉,但是好的,就这样吧。我确信此修复程序适用于其他版本的 Ubuntu。 从http://www.sopcast.com/download/libstdcpp5.tgz 下载 libstdc++.so.5。您需要将文件解压并放在 /usr/lib 中。

确保在使用 g++ 构建应用程序时添加 -llibstdc++.so.5(此链接 stdc++ v5)

然后谷歌“Connector c++ Ubuntu 12.04”并查找构建并为您的 Arch 下载 .deb。

对于 Ubuntu 12.04,这里是 .debs 的 URL https://launchpad.net/ubuntu/precise/+source/mysql-connector-c++/+builds 选择你的拱门,即。 Amd64 并下载 Built Files 下的两个 .debs。使用包管理器打开并安装。您现在应该可以在没有问题的情况下运行您的应用了。

编辑 您不需要链接 libstdc++.so.5,您可能必须在您的系统上,但在 Ubuntu 12.04 amd64 上不需要。

【讨论】:

    【解决方案2】:

    让您的 C++ 程序在 2 分钟内与 MySQL 对话!

    注意:这适用于带有 MySQL(典型 LAMP 设置)的 Ubuntu 12.04 服务器 (AWS EC2),不保证向后兼容性。

    要从 C++ 程序访问 MySQL 数据库,您必须首先使用以下命令行安装一些 mysql 库文件

    sudo apt-get install libmysqlclient-dev
    

    将名为“mysql_config”的配置文件保存在您将保存的同一目录中(并运行您的应用程序 - 让我们说“/temp”)

    mysql_config --cflags
    -I/usr/include/mysql  -DBIG_JOINS=1  -fno-strict-aliasing   -DUNIV_LINUX
    mysql_config --libs
    -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient
    

    编译你的 c++ 文件“myapp.cpp”
    sudo g++ -o myapp $(mysql_config --cflags) myapp.cpp $(mysql_config --libs)
    

    基于this excellent functional example编写的Coding Friends

    【讨论】:

    • 您已经发布了四次相同的答案,我们认为这有点垃圾邮件。请不要这样做。如果您这样做,则通常意味着问题是重复的,因此请这样标记它们。如果他们不是完全的骗子,那么只需在指向此答案的问题下发表评论。谢谢。
    • 我很抱歉@Kev,答案适合 4 个问题。我该怎么办?让这些问题没有正确的答案?它们不是完全重复的,它们是有效的问题,我的回答对所有问题都有效。我可以回答指向另一个问题的答案,但没有人阅读。而且,恕我直言,这些问题的先前答案坦率地说是蹩脚的。但是,既然你制定了规则,我不会再这样做了,以免我再次因为试图帮助别人而被称为“垃圾邮件”。 ps:我正在尝试更改答案以免成为“垃圾邮件”,但找不到它们,对不起。
    猜你喜欢
    • 2017-04-15
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多