首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:使用Free()

C:使用Free()
EN

Stack Overflow用户
提问于 2016-10-16 00:47:58
回答 1查看 70关注 0票数 0

我有一个指向结构的指针数组,一旦不再需要它们,我就尝试在它们上使用free()。下面是这些结构的设置方式:

代码语言:javascript
复制
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()

代码语言:javascript
复制
SDL_FreeSurface(game->playerLasers[i]->sprite);
free(game->playerLasers[i]);

我用free(game->playerLasers[i]);编译它,没有得到任何警告或错误。程序会运行,但是一旦free()运行,我就会得到一个分段错误。

当我使用valgrind运行程序时,奇怪的是,我没有得到分段错误,但是一旦运行free(),我就得到了以下输出:

代码语言:javascript
复制
==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)

有没有人能给我一个提示?

EN

回答 1

Stack Overflow用户

发布于 2016-10-16 01:49:06

在valgrind下运行您的程序,大部分时间不会崩溃,因为您是在valgrind创建的内存空间中运行的,可以说,valgrind对您的程序更具容错能力。

除非尝试释放非指针类型,否则通常不会出现编译错误。但它将在执行时崩溃,因为您将尝试释放一个错误的地址。

我非常有兴趣看到你负责释放thoose资源的功能,一个完整的。

您是否在任何地方跟踪数组的大小?是否将arrayi设置为NULL以表明它已被释放且不再可用?

当指针不可用时,请始终将其设置为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40061699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档