使用mudflap调试程序时,会报告此错误:
*******
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 :(得分:1)
int *a[ 1000 ];
这是一份声明。它声明了一个包含int
的1000个指针的数组。可以把它想象成1000个小盒子,在每个盒子里面你可以放置一个int*
。
int ** a = new int * [ 1000 ];
这是一份声明。它声明了指向int
的指针,仅此而已。它只是一个小盒子,在里面你可以放置一个int**
。
但是,您恰好使用 new-expression 的结果初始化此int**
的值:new int * [ 1000 ]
。这会动态地将一个包含1000个指针的数组分配给int,然后为您提供指向第一个指针的指针。因此,它会为您提供int**
,您可以使用。{/ p>初始化a
在第一行中,声明了int*
s的数组,因此当它超出范围时将被销毁。但是,在第二行中,只声明了int**
,只有当超出范围时才会销毁 。您动态分配的数组不会。我想你之所以得到这种违规是因为你没有破坏动态分配的对象。
你必须这样做:
delete[] a;
规则是,无论何时使用new
/ new[]
,都应该有相应的delete
/ delete[]
。