2

MySQL/C++ Connector パッケージを使用して、ローカルでホストされている自分の MySQL データベースに接続しようとしています。本当に問題を引き起こしている行は次のとおりです。

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

2 行の 2 行目にヒットすると、メモリ割り当てエラーが発生します。デバッガーからの読み出しは次のとおりです。

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..

何が間違っているのか本当にわかりません。接続ポインタそのものではないかと思ったので、今ご覧のauto_ptrに変換してみました。同じエラー。connect 関数にさまざまなパラメーターを試してみましたが、それも問題ではないようです。プログラムの早い段階でメモリリークの問題が発生する理由を誰か説明できますか?

4

2 に答える 2

3

デバッグモードを使用してリリースコネクタdllとリンクすると、同じ問題が発生します。デバッグモードのときにdebugdllを使用します。問題ない場合があります。

于 2011-09-08T08:47:51.100 に答える
1

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.
于 2011-07-25T22:09:59.490 に答える