0

短編小説

共通言語ランタイムをサポートするX64プラットフォーム用のC++アプリケーションをコンパイルし、その中のネイティブsqliteライブラリを使用すると、アプリケーションがsqlite3MemRealloc内でクラッシュし、大量のメモリ(約5GB)を割り当てようとします。

同じアプリケーションがCLRサポートなしでコンパイルされた場合、必要な機能が機能し、この量のメモリを割り当てる試みは行われません。この事実を検証するための条件でブレークポイントを設定します。

データベース自体は800KBの小さなファイルであり、単純な「select*fromXYZ」クエリを実行しようとしています。コードベースにある既存のsqlite3.7.11と最新のsqlite3.7.14の両方で試してみました。

この問題は一貫しています。アプリケーションを再構築したり、いくつかの設定で遊んだりしても、CLRサポートがあるとクラッシュしますが、CLRサポートがないと機能します。

長い話

私は、C ++で記述された既存のコードベースのコードを活用するだけでなく、.NETFrameworkの機能も活用するアプリケーションを開発しようとしていました。

既存のコード(内部でsqliteを利用する)に対してリンクするC ++/CLIアプリケーションを作成しました。私のコードはsqliteを直接使用していません。sqliteを使用する既存のコードは、残りのコードベースが依存するネイティブC++ライブラリです。そのため、簡単に触れることができず、System.Data.Sqliteを単純に使用することはできません。

.NET Frameworkへのすべての依存関係を削除し、.NET Frameworkコードを使用せずに既存のネイティブコードのみを利用する単純なアプリケーションを作成し、CLRサポートの有無にかかわらず2回コンパイルすることで、この問題を切り分けました。

4

1 に答える 1

0

最終的に、この問題は、SQLITEをmemsys5メモリアロケータでコンパイルし、起動時に使用するように構成することで解決されました。MSVCRTのメモリ割り当てに依存せず、独自の内部割り当て戦略に依存している場合、すべてが機能しました。

不思議な力で、CLRの存在がMSVCRTのメモリ割り当て機能と干渉しているようです。

詳細については、こちらをご覧ください

于 2012-12-11T12:54:40.777 に答える