C中重复的指针资源处理

时间:2018-05-31 08:26:16

标签: c pointers memory-management memory-leaks

这是我的一些碰撞检测代码。我使用指针使我的代码更小,更易读(有问题的指针是NULL)。我想知道,当创建额外的指针以瞄准现有数据时,是否应该.free()额外的指针输出或调用void SceneUpdate(GameScene* myGs){ //Update code for balls //We get the last existing ball , which is the moving one presumably Object* myBall = &(myGs->myBalls[myGs->ballCount - 1]); //If ball is moving if (!myBall->isStatic){ //Move according to velocity myBall->position.x += myBall->velocity.x; myBall->position.y += myBall->velocity.y; //Bounce if (myBall->position.x < X_MIN || myBall->position.x > X_MAX) myBall->velocity.x *= -1; //Collide with ceiling if (myBall->position.y < Y_MIN) { myBall->velocity.y = 0; myBall->velocity.x = 0; myBall->position.y = Y_MIN; myBall->isStatic = true; } //After update calc , update collision data myBall->maxExtent.x = myBall->position.x + 7; myBall->maxExtent.y = myBall->position.y + 7; //Values //y //RotOn //ODisable //Shape myBall->myAddress[0] = ( ((int)myBall->position.y << 0) | (0 << 8) | (0 << 9) | (0 << 14) ); //x //HFlip //VFlip //Size myBall->myAddress[1] = ( ((int)myBall->position.x << 0) | (0 << 12) | (0 << 13) | (0 << 14) ); //ID //Priority //Palette myBall->myAddress[2] = ( (myBall->colour << 0) | (0 << 10) | (0 << 12) ); //Collision check: After Update, for every not static ball, check collision with statics //Edit: Only one ball is non Static at max Collision(myGs , myBall->ID); } //Else if static , update does nothing. } ,以避免在运行时可能的内存丢失。

{{1}}

我认为他们不需要free()方法,因为我不想删除他们指向的数据。一旦它们超出范围,它们是否已被处理?

我经常在我的Gba项目中使用这种方法,以使代码更直观,所以我担心可能的内存泄漏。

3 个答案:

答案 0 :(得分:0)

    Object* thisBall = myGs->myBalls[index];

    float thisLeft = thisBall.position.x;
//                           ^

这不能编译。 thisBall是指针,而不是结构(或联合)。您需要thisBall->position

也就是说,每个malloc都应与free配对。您的代码不会malloc任何内容,因此无需拨打free

  

我认为他们不需要free()方法,因为我不想删除他们指向的数据。

这是正确的。

设置指向NULL(或任何其他值)的指针对内存管理没有直接影响。特别是,它不会释放任何记忆。

在变量超出范围之前设置变量也毫无意义。例如:

{
    Object *thisBall = myGs->myBalls[index];
    doStuffWith(thisBall);
    // ...

    thisBall = NULL;
}

编译器可能只会优化thisBall = NULL,因为它是一个&#34;死写&#34;:thisBall在这一行之后不被使用(并且它不能被使用,因为它的生命周期在})结束,因此无需将其设置为任何内容。

答案 1 :(得分:0)

我看不到动态内存分配(没有mallocs,也没有reallocs,只是堆栈中的局部变量,所以它们将根据它们的范围进行管理),因为你不需要释放非分配动态内存(你的堆是空的)。

一个提示,为什么你使用了很多本地浮点变量?这些值已在结构thisBallotherBall中。

编辑:如果myGs是堆中的变量,则必须添加定义myGs并且管理其分配的代码。

答案 2 :(得分:0)

考虑到你没有使用任何malloc,我只会回答你的问题:

每个现代操作系统都会在程序退出后恢复所有已分配的内存空间,所以是的,一旦它们超出范围就会被处理掉,你不必担心内存泄漏。

如果你不使用free()它就没有坏处;除了你需要更多存储空间的运行时成本,这不是你的情况,因为你说你不想删除他们的数据指向。 但是对于良好的样式编码,最好尽快释放内存,因为你不再需要它了。