“ RuntimeError:尝试超出范围的内存访问”,尝试将字符串保存在WASM堆中,然后将指向该字符串的指针保存在结构中

问题描述 投票:0回答:1

我在将指针和字符串的长度和长度保存在Struct中后,试图将WASM堆中的字符串另存为Uint8Array,以便以后可以访问该字符串。以下是我在rust中的代码>

#[wasm_bindgen]
pub struct CustomString{
    ptr : *const u8,
    len: usize
}

#[wasm_bindgen]
impl CustomString{
    pub fn create(len:usize) -> Self{
        let mut d = Vec::with_capacity(len);
        log!("{}",len);

        CustomString{
            ptr: d.as_ptr(),
            len
        }
    }

    pub fn as_ptr(&self) -> *const u8{
        self.ptr
    }

    pub fn print_string(&self){
        let js = unsafe { std::slice::from_raw_parts(self.ptr, self.len) };
        let js = unsafe { std::str::from_utf8_unchecked(js) };
        log!("{}",js) 
    }
}

我的JS辅助代码如下:

function myTest (){
    debugger;
    const { memory } = wasm;
    let encoder = new TextEncoder();
    let mystring = "Ujjal";
    let encodedString = encoder.encode(mystring);

    let length = encodedString.length;
    console.log(length)

    let cs = CustomString.create(length);

    let ptr = cs.as_ptr();

    const asBytes = new Uint8Array(memory.buffer, ptr, length);

    asBytes.set(encodedString);

    return cs;

}

let cs = myTest();


function decode(cs){

    cs.print_string();
}

decode(cs);

理想情况下,它应该打印给定的字符串,但显示一些不相关的垃圾值。无法弄清楚出了什么问题,因为我刚接触生锈和浪费。

这是我在运行此命令时收到的控制台消息,有时出现内存错误。Console log

我正在尝试在将字符串的指针和长度以及Struct中的长度保存并编码后,将WASM堆中的字符串保存为Uint8Array,以便以后可以访问该字符串。下面是我的代码在锈#...

rust webassembly wasm-bindgen wasm-pack docx-wasm
1个回答
0
投票

create中,您正在创建vec d并获取其指针,但是在函数结束后,vec d被释放并且您的指针指向无效的内存。

© www.soinside.com 2019 - 2024. All rights reserved.