gpt4 book ai didi

c - C 中的重复指针资源处理

转载 作者:行者123 更新时间:2023-11-30 16:31:25 26 4
gpt4 key购买 nike

这是我的一些碰撞检测代码。我正在使用指针来使我的代码更小、更易读(有问题的指针是myBall)。我想知道,在创建针对现有数据的附加指针时,是否应该将该附加指针设为 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.
}

我的印象是他们不需要 free() 方法,因为我不想删除他们指向的数据。一旦超出范围,它们会得到处理吗?

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

最佳答案

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

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

这无法编译。 thisBall 是一个指针,而不是一个结构(或 union )。您需要thisBall->position

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

I am under the impression that they dont need the free() method, since I don't want to delete the data they point to.

这是正确的。

<小时/>

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

在变量超出范围之前设置变量也是没有意义的。例如:

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

thisBall = NULL;
}

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

关于c - C 中的重复指针资源处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50619870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com