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 によると合法ではなく、上記のエラーが生成されます。

最初の例と 2 番目の例の違いがあるとすれば、それは何ですか?

4

1 に答える 1

1
int *a[ 1000 ];

これは宣言です。への 1000 個のポインターの配列を宣言しintます。1000 個の小さな箱のように考えてください。それぞれの中にint*.

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

これは宣言です。へのポインタへのポインタを宣言するintだけです。それはただの小さな箱で、その中にはint**.

ただし、たまたま、 this の値をnew-expression :int**の結果で初期化しています。これにより、1000 個のポインターの配列が int に動的に割り当てられ、最初のポインターへのポインターが提供されます。したがって、初期化する が得られます。new int * [ 1000 ]int**a

最初の行では、s の配列int*が宣言されているため、スコープ外になると破棄されます。ただし、2 行目では、単に anint**が宣言されており、スコープ外になると、それのみが破棄されます動的に割り当てた配列はそうではありません。この違反が発生する理由は、動的に割り当てられたオブジェクトを破棄していないためだと思います。

あなたがしなければならないでしょう:

delete[] a;

new/を使用するときはいつでもnew[]、対応するdelete/が必要であるという規則がありますdelete[]

于 2013-04-04T14:26:59.153 に答える