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本身是多余的,因为您没有以任何方式使用 return。


在回答您关于新代码是否存在内存泄漏的问题时,是的。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 回答