1

このCコードにリークはありますか?
答えは正解ですが、次のように記述しても問題ないかどうかを知りたいだけです。

// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}

更新しました

だから今私はそれを次のように更新しています:

// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}

 free(p);

まだ漏れはありますか?

t7を印刷する正しい方法は何ですか

4

3 に答える 3

8

はい、リークがあります。動的に割り当てられたメモリのアドレスを格納しているポインタをすぐに上書きします。そのため、メモリに到達できなくなります。

于 2012-06-16T18:18:19.427 に答える
5

Cのすべてには、終了前に到達可能mallocな対応するものが必要です。freeこれに対する例外は、メモリリークを構成します。

mallocinの戻り値を格納し、pそれを上書きすることによってポインタを失います。そのため、ポインタが解放される可能性はありません。あなたの特定のケースではmalloc、あなたはいかなる方法でもリターンを使用していないので、それ自体は冗長です。


新しいコードにメモリリークがあるかどうかという質問に答えて、そうです。mallocメモリを割り当て、割り当てられたメモリへのポインタを返します。ポインタの値を上書きしてポインタを失い、割り当てられたメモリを使用することはありません。さらに悪いことに、あなたは今free、未定義の振る舞いである自動変数のように見えるものを求めています。

印刷が正しく機能している場合は、次のようにすることができます。

__m128i t7 = _mm_adds_epi16(t5, t6);
unsigned short *p = (unsigned short *)&t7;
for(int i=0;i<8;i++) {
    printf("%d\n", p[i]);
}

malloc割り当てられたメモリを使用していないため、は冗長です。

于 2012-06-16T18:18:21.897 に答える
0

freeによって割り当てられたメモリを解放しますmalloc

unsigned short *p= (unsigned short *)malloc(8);

ここでは、8バイトのメモリを割り当て、そのメモリアドレスをに割り当てていますp

p=(unsigned short *)&t7;

に別のメモリアドレスを割り当てましたp。以前のメモリアドレス(によって返されたものmalloc)が上書きされました。8バイトが割り当てられたメモリアドレスがわかりません。

free(p);

メモリーリーク。によって割り当てられたメモリを指していmallocません。

于 2012-06-16T19:08:23.023 に答える