【问题标题】:MySQL C++ Connector memory overflow errorMySQL C++ 连接器内存溢出错误
【发布时间】:2011-07-25 19:49:31
【问题描述】:

我一直在尝试使用 MySQL/C++ 连接器包连接到我自己的本地托管 MySQL 数据库。真正给我带来问题的台词是:

driver = get_driver_instance();
auto_ptr < Connection > con (driver -> connect("tcp://127.0.0.1:3306", "root", "root"));

点击两行中的第二行会给我一个内存分配错误。这是调试器的读数。

HEAP[mySQLTestApp.exe]: Invalid allocation size - CCCCCCD0 (exceeded 7ffdefff)
First-chance exception at 0x7c812afb in mySQLTestApp.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012fa88..
HEAP[mySQLTestApp.exe]: Invalid allocation size - CCCCCCCD (exceeded 7ffdefff)
First-chance exception at 0x7c812afb in mySQLTestApp.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012f428..
First-chance exception at 0x7c812afb in mySQLTestApp.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
Unhandled exception at 0x7c812afb in mySQLTestApp.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012f428..

我真的不确定我做错了什么。我认为它可能是 Connection 指针本身,所以我尝试将其转换为您现在看到的 auto_ptr。同样的错误。我已经为连接函数尝试了不同的参数,但这似乎也不是问题。谁能解释为什么我在程序的早期就遇到内存泄漏问题?

【问题讨论】:

  • 调试模式下未初始化的内存是 MSVC 的usually filled with CCCCCCCC。看起来某个地方正在使用未初始化的值。
  • 有机会获得实际的堆栈跟踪吗?
  • 驱动需要一些二次初始化才能使用吗?
  • 所以唯一可能导致此错误的是驱动程序,对吗?所有参数都是常量,连接还没有建立。但是我在 driver = get_driver_instance() 行之前和之后设置了一个断点,它似乎设置到内存中的某个位置。
  • 就更多的初始化而言,这直接来自开发指南示例,因此如果有一些我没有调用的功能,那么官方示例中不会提及。就记忆而言,这是驱动程序随着时间的推移所指出的。在 get_driver_instance:0xcccccccc 之前(这是意料之中的。我们还没有初始化它)。在 get_driver_instance: 0x003d55a8 之后。这显然是在指向一些东西,我只是不知道是什么。

标签: c++ mysql mysql-connector bad-alloc


【解决方案1】:

我遇到了同样的问题,当我使用调试模式时,与发布连接器 dll 链接。在调试模式下使用调试dll,可能没问题。

【讨论】:

    【解决方案2】:

    使用 auto_ptr 时必须小心。因为 auto_ptr 具有不寻常的复制语义(复制操作将所有权转移到指向的对象,而不是复制指针),所以很容易在您完成对象之前意外删除它。确保您的 auto_ptr 对象永远不会出现在赋值的右侧,并且不要将它们作为参数传递给按值获取 auto_ptr 的函数。您没有显示足够多的代码来彻底诊断它。

    例如

    // declaration for some function you've defined later
    void some_user_function(auto_ptr<Connection> con);
    
    auto_ptr<Connection> con(driver->connect("tcp://127.0.0.1:3306", "root", "root"));
    some_user_function(con);
    // At this point con will be a NULL pointer, and the Connection object it used to point
    // to will have been deleted.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多