此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的正确方法是什么
答案 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
分配的内存。