Mudflap无理地报告内存访问违规

时间:2013-04-04 14:13:58

标签: c++ debugging

使用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不合法并产生上述错误。

第一个和第二个例子之间有什么区别?

1 个答案:

答案 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[]