这个C代码有泄漏吗?

时间:2012-06-16 18:16:23

标签: c malloc

此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的正确方法是什么

3 个答案:

答案 0 :(得分:8)

是的,有泄漏。您立即覆盖存储动态分配的内存地址的指针。这样就无法再访问内存了。

答案 1 :(得分:5)

C中的每个malloc都需要有一些在终止前可以访问的free。任何例外情况都会造成内存泄漏。

您将malloc的返回值存储在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是多余的,因为您甚至没有使用它分配的内存。

答案 2 :(得分:0)

free将释放malloc分配的所有内存。

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

这里已经分配了8个字节的内存,并将该内存地址分配给p

p=(unsigned short *)&t7;

您刚刚为p分配了不同的内存地址;先前的内存地址(malloc返回的内存地址)已被覆盖。我们不再知道已经分配了8个字节的内存地址。

free(p);

内存泄漏。它不再指向由malloc分配的内存。