我正在为一个不支持std或alloc的平台编写Rust代码,所以我只能使用core.最近,我的代码开始产生以下编译错误:

error: no global memory allocator found but one is required; link to std or add `#[global_allocator]` to a static item that implements the GlobalAlloc trait

error: `#[alloc_error_handler]` function required, but not found

有没有办法让rust编译器告诉我为什么需要全局内存分配器?据推测,在我的代码或依赖项中的某个地方,有什么东西试图分配,这导致它出错,但我不知道这是在哪里发生的.

对于这种情况,我在网上看到的唯一建议是创建一个虚拟自定义分配器,然后查看编译后的二进制文件以获取对它的引用.然而,我这样做了,但在它生成的二进制可执行文件中找不到任何对我的自定义分配器的引用,这让我对正在发生的事情更加困惑.

推荐答案

在我的例子中,使用cargo vendor将我所有依赖项的源代码下载到本地目录中,然后我使用ripgrep在依赖项中搜索extern crate alloc;,这导致我在不知情的情况下找到了一个依赖项.我不知道为什么分配没有出现在生成的二进制文件中,但这个工具比实现虚拟分配器更好地 bootstrap 我找到了原因.

Rust相关问答推荐

什么是谓词的简短和简洁类型

为什么拥有的trait对象的相等运算符移动了正确的操作数?

为什么我需要在这个代码示例中使用&

将JSON密钥转换为Polars DataFrame

为什么Rust函数的移植速度比C++慢2倍?

为什么铁 rust S似乎有内在的易变性?

一种随机局部搜索算法的基准(分数)

在macro_rule中拆分模块和函数名

习语选项<;T>;到选项<;U>;当T->;U用From定义

可选包装枚举的反序列化

一次不能多次borrow *obj作为可变对象

Google chrome 和 Apple M1 中的计算着色器

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

为什么我可以同时传递可变和不可变引用?

为什么指定生命周期让我返回一个引用?

如何在 Rust 中编写涉及异步的重试函数

Rustlings 切片原语

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

使用 `.` 将 T 转换为 &mut T?

Cargo:如何将整个目录或文件包含在功能标志中?