2015-07-18 10 views
9

मैं जंग के एफएफआई के माध्यम से एलएलवीएम एपीआई को बुला रहा हूं। LLVMPrintModuleToStringuses strdup to create a string। हालांकि, जब मैं CString में सूचक को लपेटता हूं, तो मुझे एक त्रुटि मिलती है जब जंग इसे छोड़ देता है।मैं जंग में एफएफआई के माध्यम से आवंटित एक * char कैसे मुक्त करूं?

#![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); 
} 

वेलग्रिंड त्रुटि:

==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 

ऐसा क्यों है? एक सीपीआई से *char को संभालने का सही तरीका क्या है?

+0

क्या कोई सी फ़ंक्शन इसे मुक्त करता है, और उस सी फ़ंक्शन को कॉल करता है? – WiSaGaN

उत्तर

13

the function's documentation के अनुसार:

Use LLVMDisposeMessage to free the string.

सामान्य स्थिति में, यदि आप एक पुस्तकालय है कि स्मृति आवंटित करता है में एक समारोह फोन, आपको लगता है कि पुस्तकालय है कि स्मृति को मुक्त कर देते में एक और समारोह कॉल करना चाहिए; इसे आम तौर पर फ़ंक्शन के अनुबंध के हिस्से के रूप में दस्तावेज किया जाना चाहिए।

एक समारोह के लिए दस्तावेज़ बताता है कि free उपयोग करने के लिए है, तो आप एक समस्या है देगा, जब आपके आवेदन लाइब्रेरी की malloc (जैसे आपके आवेदन लिंक करने के लिए इसी msvcr120 साथ free के साथ जोड़ने नहीं है, लेकिन साथ लाइब्रेरी लिंक msvcr100)। यही कारण है कि अच्छे पुस्तकालय आपके लिए आवंटित संसाधनों को रद्द करने का एक तरीका प्रदान करते हैं।

जंग में डिफ़ॉल्ट स्मृति आवंटक सी malloc नहीं है, लेकिन एक अन्य आवंटक jemalloc कहा जाता है। CString मानता है कि स्ट्रिंग को रस्ट के मेमोरी आवंटक के साथ आवंटित किया गया था, इसलिए जब CString का विनाशक चलता है, तो यह जेमलोक के free चलाता है (आप अपने कॉल स्टैक में je_ -prefixed फ़ंक्शंस से बता सकते हैं), लेकिन यह विफल हो जाता है क्योंकि स्ट्रिंग को आवंटित नहीं किया गया था जेमलोक का malloc

+0

धन्यवाद, यह वास्तव में रोशनी है। –

संबंधित मुद्दे