2013-04-04 59 views
0

當使用擋泥板調試我的程序,它會報告這個錯誤:擋泥板不合理報告內存訪問衝突

******* 
mudflap violation 1 (unregister): time=1365083992.573241 ptr=0x20ce510 size=0 
pc=0x7f745259d5f6 
Nearby object 1: checked region begins 257B after and ends 257B after 
mudflap object 0x20ce440: name=`malloc region' 
bounds=[0x20cc4d0,0x20ce40f] size=8000 area=heap check=0r/0w liveness=0 
alloc time=1365083992.572980 pc=0x7f745259da51 
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/libmudflap.so.0(__mf_register+0x41) [0x7f745259da51] 
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/libmudflap.so.0(__wrap_malloc+0xe2) [0x7f745259e752] 
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/libstdc++.so.6(_Znwm+0x1d) [0x7f7452348f9d] 
     /usr/lib/gcc/x86_64-pc-linux-gnu/4.6.3/libstdc++.so.6(_Znam+0x9) [0x7f74523490b9] 
number of nearby objects: 1 
Neoprávněný přístup do paměti (SIGSEGV) 

測試位之後,似乎

int *a[ 1000 ]; 

是合法的,而

int ** a = new int * [ 1000 ]; 

根據Mudflap不合法並生成上述錯誤。

第一個例子和第二個例子之間有什麼區別?

+0

我可以解釋這種差異,但我無法解釋錯誤。 – 2013-04-04 14:15:42

+0

@sftrabbit請繼續 – Josef 2013-04-04 14:20:31

回答

1
int *a[ 1000 ]; 

這是一個聲明。它聲明瞭一個指向int的1000個指針的數組。把它想象成1000個小盒子,每個盒子裏面你可以放置一個int*

int ** a = new int * [ 1000 ]; 

這是一個聲明。它聲明瞭一個指向指向int的指針,僅此而已。它只是一個小盒子,裏面可以放置一個int**

然而,它只是恰巧,您使用的是新表達的結果初始化這個int**的價值:new int * [ 1000 ]。這會動態地爲int分配一個1000個指針的數組,然後給你一個指向第一個指針的指針。所以它給了你一個int**,你初始化了a

在第一行中,聲明瞭一個int*的數組,並在超出作用域時被銷燬。但是,在第二行中,只聲明int**,並且只有超出範圍時纔會銷燬。您動態分配的數組將不會。我想你得到這種違規的原因是因爲你沒有銷燬動態分配的對象。

你必須做的:

delete[] a; 

的規則是,只要您使用new/new[],應該有一個相應的delete/delete[]