Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何释放Rust中通过FFI分配的*字符?_Rust_Ffi - Fatal编程技术网

如何释放Rust中通过FFI分配的*字符?

如何释放Rust中通过FFI分配的*字符?,rust,ffi,Rust,Ffi,我通过Rust的FFI调用LLVM APILLVMPrintModuleToString。但是,当我将指针包装在CString中时,如果锈掉了指针,就会出现错误 #![feature(cstr_memory)] use std::ffi::CString; extern crate llvm_sys as llvm; fn main() { let llvm_ir_cstring; unsafe { let module = llvm::core::LLVMM

我通过Rust的FFI调用LLVM API<代码>LLVMPrintModuleToString。但是,当我将指针包装在
CString
中时,如果锈掉了指针,就会出现错误

#![feature(cstr_memory)]
use std::ffi::CString;

extern crate llvm_sys as llvm;

fn main() {
    let llvm_ir_cstring;
    unsafe {
        let module = llvm::core::LLVMModuleCreateWithName(b"nop\0".as_ptr() as *const _);
        let llvm_ir_char_ptr = llvm::core::LLVMPrintModuleToString(module);
        llvm::core::LLVMDisposeModule(module);
        llvm_ir_cstring = CString::from_ptr(llvm_ir_char_ptr);
    }

    println!("llvm_ir_cstring: {:?}", llvm_ir_cstring);
}
Valgrind错误:

==10413== Invalid read of size 4
==10413==    at 0x4870586: pthread_mutex_lock (in /usr/lib/libpthread-2.21.so)
==10413==    by 0x17F89B: je_arena_dalloc_small (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x178C30: je_sdallocx (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x10FA57: heap::imp::deallocate::h1fb92d59333c497bkja (heap.rs:268)
==10413==    by 0x10F999: heap::deallocate::h5680e3fedc9e96320da (heap.rs:89)
==10413==    by 0x10F929: heap::exchange_free::h452463f962f7ec23kfa (heap.rs:131)
==10413==    by 0x10F8C5: Box$LT$$u5b$u8$u5d$$GT$::drop.1769::haf7017472635c7cf (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x10F836: std..ffi..c_str..CString::drop.1766::h04d2b3db8d468f0c (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x10F5FF: main::h04b7feb343e229ccgaa (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x16DBCA: rt::unwind::try::try_fn::h2403085009213705177 (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x16FF5A: rust_try_inner (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==    by 0x16FF33: rust_try (in /home/wilfred/projects/bfc/target/debug/bfc)
==10413==  Address 0x1d684 is not stack'd, malloc'd or (recently) free'd
为什么会这样?处理C API中的
*char
的正确方法是什么?

根据:

使用LLVMDisposeMessage释放字符串

在一般情况下,如果调用库中分配内存的函数,则应调用该库中释放内存的另一个函数;这通常应记录为职能部门合同的一部分

如果函数的文档告诉您使用
free
,那么如果您的应用程序没有链接到与库的
malloc
对应的
free
(例如,您的应用程序链接到msvcr120,但库链接到msvcr100),则会出现问题。这就是为什么好的库提供了一种方法来释放它为您分配的资源


Rust中的默认内存分配器不是C的
malloc
,而是另一个调用的分配器
CString
假设字符串是用Rust的内存分配器分配的,因此当
CString
的析构函数运行时,它会运行jemalloc的
free
(您可以从调用堆栈中的
je_
前缀函数看出),但是它失败了,因为字符串没有分配给jemalloc的
malloc

让一个C函数释放它,并调用这个C函数?谢谢,这真的很有启发性。