2011-09-17 8 views
0

MySQL ++に問題があり、必然的に助けが必要です。 Visual Studio 2010、MySQL ++ v3.1.0、MySQL v5.1.59(x86 & x64)を使用しています。 すべてのライブラリが正しくコンパイルされています。このエラーは、コンパイラ設定 "Both(/ RTC1、equiv。〜/ RTCsu)(/ RTC1)"がオンになっているため、Debugバージョンでのみ発生します。MySQL ++ - ランタイムチェック失敗#2 - 変数の周りのスタックが壊れていました

編集:これは、デバッグバージョンでのみ発生することに注意してください。リリースではそれは魔法のように動作します 問題をmysqlpp_d.dllに戻して追跡しました。参照カウントのために、デストラクタでMySQL ++オブジェクトがクラッシュしています。 refカウンタのメモリにアクセスできないという不満があり、それを減らそうとするとクラッシュします。少なくとも、私はそれが起こると思います。

は、私は、これは必ずすべてがderefrenced、正しい順序で削除される作ってみました(でも、その無関係なカントー、しかし私は、私は願っています真の問題追跡助けた):

http://pastebin.com/Ru0uYcy9

それはでクラッシュをLauncher.exeの0x000007feeef5dd4c(mysqlpp_d.dll)の最初の例外です。0xC0000005:0x000007feeeff5148という場所にアクセス違反を書き込みます。 Launcher.exeの0x000007feeef5dd4c(mysqlpp_d.dll)で処理されない例外:0xC0000005:アクセス違反が0x000007feeeff5148に書き込まれました。ここ

そしてbreakes: http://pastebin.com/9Mfr7NwB

+0

ライブラリのデバッグバージョンとアプリケーションのデバッグバージョンをリンクしていますか? – alexisdm

+0

はい、すべてのバージョンですべてが正しくリンクされていることを確認しました。 – CFortner

+0

さて、もう少しデバッグを行い、新しいコンソールプロジェクトを作成しました。そして私は誤りを受けなかった。 2つの間の唯一の違いは、1つはDLLプロジェクトで、もう1つはコンソールプロジェクトですが、これはコードの動作を考慮すると問題ではないと思います。 これは、エンジンで働いている人がメモリ管理をしているという結論に至り、MySQL ++がそのメモリをどのように処理するかに影響します。 – CFortner

答えて

0

このコードは、重大なバグがあります:あなたはすべての結果セットを消費していない

mysqlpp::UseQueryResult res; 
{ 
    mysqlpp::Query query = conn.query(); 
    query << "SELECT USER();"; 
    res = query.use(); 
    row = res.fetch_row(); 
} 

。 MySQLでは、データを返すストアドプロシージャは少なくとも2つの別々の結果セットを返します。最初のものは求めた結果であり、2番目のものは呼び出し自体に関するステータス情報です。これを処理する正しい方法については、MySQL ++ソースディストリビューションのexamples/multiquery.cppを参照してください。 MySQL ++ユーザマニュアルのsection 3.16も参照してください。

この主な結果は、後で同じ接続でクエリが失敗することです。

あなたのメモリ破損は実際には副次的な効果であり、主な問題は、同じ接続で2つの重複するクエリを実行しようとしているというMySQL C APIの試みを無視することに起因すると思います。最初の結果セット全体を消費する。あなたが投稿した小さなコードから、返されたエラーコードを無視していることがわかります。したがって、MySQL ++の例外も無効にしていれば、このエラーは完全に無視され、 t。

ところで、クエリの最後のセミコロンを忘れてください。これはC APIでは必要ではなく、特に複数のクエリが混在しても混乱を招く可能性があります。セミコロンは、単一のクエリで複数の文を区切る場合にのみ使用します。

関連する問題