我有一个指向结构的指针数组,一旦不再需要它们,我就尝试在它们上使用free()。下面是这些结构的设置方式:
typedef struct {
SDL_Surface *sprite;
SDL_Rect rect;
} Laser;
Laser *fireLaser(char *sprite, int x, int y)
{
Laser *laser = malloc(sizeof(Laser));
laser->sprite = loadSurface(sprite);
laser->rect.x = x;
laser->rect.y = y;
return laser;
}
game->playerLasers[player->laserCount++] = fireLaser("images/laser.bmp", (player->rect.x, player->rect.y);一旦不再需要它,我就尝试在它上面使用free()。
SDL_FreeSurface(game->playerLasers[i]->sprite);
free(game->playerLasers[i]);我用free(game->playerLasers[i]);编译它,没有得到任何警告或错误。程序会运行,但是一旦free()运行,我就会得到一个分段错误。
当我使用valgrind运行程序时,奇怪的是,我没有得到分段错误,但是一旦运行free(),我就得到了以下输出:
==2010== Invalid read of size 8
==2010== at 0x4012D8: spawnGrunts (main.c:196)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)
==2010== Address 0xcfce9c0 is 0 bytes inside a block of size 32 free'd
==2010== at 0x4C2AD90: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2010== by 0x4012FF: spawnGrunts (main.c:197)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)
==2010== Block was alloc'd at
==2010== at 0x4C29BBE: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2010== by 0x400E65: loadGrunt (main.c:105)
==2010== by 0x4011FE: spawnGrunts (main.c:182)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)
==2010==
==2010== Invalid free() / delete / delete[] / realloc()
==2010== at 0x4C2AD90: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2010== by 0x4012FF: spawnGrunts (main.c:197)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)
==2010== Address 0xcfce9c0 is 0 bytes inside a block of size 32 free'd
==2010== at 0x4C2AD90: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2010== by 0x4012FF: spawnGrunts (main.c:197)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)
==2010== Block was alloc'd at
==2010== at 0x4C29BBE: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2010== by 0x400E65: loadGrunt (main.c:105)
==2010== by 0x4011FE: spawnGrunts (main.c:182)
==2010== by 0x4013FC: updates (main.c:219)
==2010== by 0x4016CD: main (main.c:277)有没有人能给我一个提示?
发布于 2016-10-16 01:49:06
在valgrind下运行您的程序,大部分时间不会崩溃,因为您是在valgrind创建的内存空间中运行的,可以说,valgrind对您的程序更具容错能力。
除非尝试释放非指针类型,否则通常不会出现编译错误。但它将在执行时崩溃,因为您将尝试释放一个错误的地址。
我非常有兴趣看到你负责释放thoose资源的功能,一个完整的。
您是否在任何地方跟踪数组的大小?是否将arrayi设置为NULL以表明它已被释放且不再可用?
当指针不可用时,请始终将其设置为空。
https://stackoverflow.com/questions/40061699
复制相似问题