0

短篇小说

当为具有公共语言运行时支持的 X64 平台编译 C++ 应用程序并使用其中的本机 sqlite 库时,应用程序在 sqlite3MemRealloc 内崩溃,试图分配大量内存(大约 5GB)。

当在没有 CLR 支持的情况下编译相同的应用程序时,所需的功能会起作用,并且不会尝试分配此数量的内存。我设置了一个带有条件的断点来验证这个事实。

数据库本身是一个 800KB 的小文件,我们正在尝试运行一个简单的“select * from XYZ”查询。使用我们代码库中现有的 sqlite 3.7.11 和最新的 sqlite 3.7.14 进行了尝试。

这个问题是一致的。无论我重建应用程序或使用某些设置多少次 - 在 CLR 支持下它会崩溃,在没有 CLR 支持的情况下它可以工作。

更长的故事

我试图开发一个应用程序,该应用程序利用现有的用 C++ 编写的代码库中的代码,但也利用了 .NET 框架的强大功能。

我创建了一个 C++/CLI 应用程序,该应用程序链接到现有代码(在其中使用 sqlite)。我的代码不直接使用 sqlite。使用 sqlite 的现有代码是其余代码库所依赖的本机 C++ 库。所以我不能轻易触摸它,因此不能简单地使用 System.Data.Sqlite。

我通过删除对 .NET 框架的所有依赖项并创建一个简单的应用程序来隔离这个问题,该应用程序只使用现有的本机代码而不使用任何 .NET 框架代码,并编译两次 - 有和没有 CLR 支持。

4

1 回答 1

0

最终,通过使用 memsys5 内存分配器编译 SQLITE 并将其配置为在启动时使用它来解决问题。当它不依赖于 MSVCRT 内存分配而是依赖于它自己的内部分配策略时,一切正常。

似乎由于某种神秘的力量,CLR 的存在干扰了 MSVCRT 的内存分配功能。

更多信息可以在这里找到。

于 2012-12-11T12:54:40.777 回答