0

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

第一个和第二个示例之间有什么区别(如果有)?

4

1 回答 1

1
int *a[ 1000 ];

这是一个声明。它声明了一个包含 1000 个指针的数组int。把它想象成 1000 个小盒子,每个里面你可以放一个int*.

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

这是一个声明。它声明了一个指向 的指针int,仅此而已。它只是一个小盒子,你可以在里面放一个int**.

但是,碰巧您正在使用new-expression :int**的结果初始化 this 的值。这会动态分配一个包含 1000 个指向 int 的指针的数组,然后为您提供指向其中第一个指针的指针。所以它给你一个,你用它来初始化。new int * [ 1000 ]int**a

在第一行中,声明了一个 s 数组,int*因此当它超出范围时将被销毁。然而,在第二行中,只int**声明了一个并且只有当它超出范围时才会被销毁您动态分配的数组不会。我想你得到这个违规的原因是因为你没有破坏动态分配的对象。

你必须这样做:

delete[] a;

规则是,无论何时使用new/ new[],都应该有一个对应的delete/ delete[]

于 2013-04-04T14:26:59.153 回答