2013-04-30 56 views
0

我試圖釋放緩衝區時出現問題。每次嘗試將緩衝區傳遞給我的釋放方法時,都會發生段錯誤。 Valgrind確認segfault位於BufferDeallocate方法中。釋放/釋放緩衝區時出現Segfault

==30960== Memcheck, a memory error detector          
==30960== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.  
==30960== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info  
==30960== Command: ./a.out              
==30960==                  
==30960== Conditional jump or move depends on uninitialised value(s)    
==30960== at 0x40178A6: index (in /lib64/ld-2.15.so)       
==30960== by 0x4007642: expand_dynamic_string_token (in /lib64/ld-2.15.so) 
==30960== by 0x4007EFD: _dl_map_object (in /lib64/ld-2.15.so)     
==30960== by 0x400135D: map_doit (in /lib64/ld-2.15.so)      
==30960== by 0x400E345: _dl_catch_error (in /lib64/ld-2.15.so)    
==30960== by 0x4001276: do_preload (in /lib64/ld-2.15.so)      
==30960== by 0x4003C11: dl_main (in /lib64/ld-2.15.so)      
==30960== by 0x40149A7: _dl_sysdep_start (in /lib64/ld-2.15.so)    
==30960== by 0x40049DC: _dl_start (in /lib64/ld-2.15.so)      
==30960== by 0x4000BA7: ??? (in /lib64/ld-2.15.so)       
==30960==                  
==30960== Conditional jump or move depends on uninitialised value(s)    
==30960== at 0x40178AB: index (in /lib64/ld-2.15.so)       
==30960== by 0x4007642: expand_dynamic_string_token (in /lib64/ld-2.15.so) 
==30960== by 0x4007EFD: _dl_map_object (in /lib64/ld-2.15.so)     
==30960== by 0x400135D: map_doit (in /lib64/ld-2.15.so)      
==30960== by 0x400E345: _dl_catch_error (in /lib64/ld-2.15.so)    
==30960== by 0x4001276: do_preload (in /lib64/ld-2.15.so)      
==30960== by 0x4003C11: dl_main (in /lib64/ld-2.15.so)      
==30960== by 0x40149A7: _dl_sysdep_start (in /lib64/ld-2.15.so)    
==30960== by 0x40049DC: _dl_start (in /lib64/ld-2.15.so)      
==30960== by 0x4000BA7: ??? (in /lib64/ld-2.15.so)       
==30960==                  
==30960== Thread 2:                
==30960== Use of uninitialised value of size 8         
==30960== at 0x400C97: bufferRead (in /home/cward/cs370/Project04/a.out)  
==30960== by 0x4E39D95: start_thread (in /lib64/libpthread-2.15.so)   
==30960==                  
==30960== Thread 1:                
==30960== Invalid read of size 4             
==30960== at 0x400919F: do_lookup_x (in /lib64/ld-2.15.so)     
==30960== by 0x4009B31: _dl_lookup_symbol_x (in /lib64/ld-2.15.so)   
==30960== by 0x400D880: _dl_fixup (in /lib64/ld-2.15.so)      
==30960== by 0x4014154: _dl_runtime_resolve (in /lib64/ld-2.15.so)   
==30960== by 0x400AAA: main (in /home/cward/cs370/Project04/a.out)   
==30960== Address 0x6f57206f6c6c6550 is not stack'd, malloc'd or (recently) free'd 
==30960==                  
==30960==                  
==30960== Process terminating with default action of signal 11 (SIGSEGV)   
==30960== General Protection Fault            
==30960== at 0x400919F: do_lookup_x (in /lib64/ld-2.15.so)     
==30960== by 0x4009B31: _dl_lookup_symbol_x (in /lib64/ld-2.15.so)   
==30960== by 0x400D880: _dl_fixup (in /lib64/ld-2.15.so)      
==30960== by 0x4014154: _dl_runtime_resolve (in /lib64/ld-2.15.so)   
==30960== by 0x400AAA: main (in /home/cward/cs370/Project04/a.out)   
[boundedbuffer] Added: Hello World!            

[boundedbuffer] in bRead               
[main] Printing from out_array:             
Hello World!                  

==30960==                  
==30960== HEAP SUMMARY: 
==30960==  in use at exit: 1,872 bytes in 2 blocks       
==30960== total heap usage: 3 allocs, 1 frees, 2,144 bytes allocated   
==30960==    

我將提供所有文件,以便每個人都能看到代碼明瞭的內容。

這裏是我的BoundedBuffer.c文件:

<snip> 

BoundedBuffer.h

<snip> 

這裏是我們的主文件,它測試BoundedBuffer。

MAIN.C:

<snip> 

上解決此問題的任何意見將是驚人的!我對編碼C非常陌生,Freeing/Allocing是C中令我困惑的主題之一。

回答

1

在您的Main.c中,您設置readParams.b = writeParams.b;當您嘗試釋放時,這會導致錯誤。 C的free方法不像C++刪除,實際上,從here,因爲您試圖釋放相同的數據兩次它導致未定義的行爲

換句話說,由於讀寫參數緩衝區都指向同一個對象,因此只能緩衝釋放其中一個對象,因爲一旦內存被釋放,您不再控制它並嘗試釋放內存你不控制就是瘋狂。

+0

謝謝,解決了這個問題! – ChrisDevWard 2013-04-30 20:42:57