这个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的正确方法是什么?
发布于 2012-06-16 18:18:21
C中的每个malloc
都需要有相应的free
,这些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
是多余的,因为您甚至没有使用它分配的内存。
发布于 2012-06-16 18:18:19
是的,有个漏洞。立即覆盖存储动态分配内存地址的指针。这样记忆就无法再访问了。
发布于 2012-06-16 19:08:23
free
将释放malloc
分配的任何内存。
unsigned short *p= (unsigned short *)malloc(8);
在这里,您已经分配了8个字节的内存,并将该内存地址分配给p
。
p=(unsigned short *)&t7;
您刚刚为p
分配了一个不同的内存地址;前面的内存地址(由malloc
返回的内存地址)已被覆盖。我们不再知道分配了8个字节的内存地址。
free(p);
内存泄漏。它不再指向malloc
分配的内存。
https://stackoverflow.com/questions/11065921
复制相似问题