# 内存（env）

> NeuroWASM 内存宿主函数——allocate、deallocate 和 abort——以及合约必须遵守的内存布局规则。

Source: https://docs.nro.world/zh/neurowasm/memory

合约导出一块线性 `memory`。宿主函数通过 `(ptr, len)` 对读写它；超出内存范围的指针或长度会使宿主函数失败（通常返回 `-1`），而不是 trap。

VM 会把调用输入复制到**偏移量 64** 处；参见[合约导出 → call](./exports#call)。

## `allocate` <Badge type="tip" text="已上线" />

```text
(import "env" "allocate" (func (param i32) (result i32)))
allocate(size: i32) → ptr: i32
```

用 bump 分配器预留 `size` 字节并返回起始地址。宿主只推进一个游标——它不会扩展内存，因此合约必须确保该范围存在。负数大小按 0 处理；单次请求上限为 **1 MiB**。供期望由宿主分配内存的工具链（AssemblyScript 等）使用。

## `deallocate` <Badge type="tip" text="已上线" />

```text
(import "env" "deallocate" (func (param i32)))
```

什么也不做——bump 分配器从不释放内存。提供它是为了让按分配器接口编写的代码能够链接。

## `abort` <Badge type="tip" text="已上线" />

```text
(import "env" "abort" (func (param i32 i32 i32 i32)))
```

AssemblyScript 的 abort 钩子，接受它是为了让此类模块能够链接。**它什么也不做，也不会停止执行**——AssemblyScript 会在其后执行 `unreachable`，真正使调用失败的是后者。如需有意让调用失败，请 trap（`unreachable`），这会回滚整个调用树；或者在调用者需要看到消息时，通过 `set_return` 返回错误。
