这是我的一些碰撞检测代码。我使用指针使我的代码更小,更易读(有问题的指针是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项目中使用这种方法,以使代码更直观,所以我担心可能的内存泄漏。
答案 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,只是堆栈中的局部变量,所以它们将根据它们的范围进行管理),因为你不需要释放非分配动态内存(你的堆是空的)。
一个提示,为什么你使用了很多本地浮点变量?这些值已在结构thisBall
和otherBall
中。
编辑:如果myGs
是堆中的变量,则必须添加定义myGs
并且管理其分配的代码。
答案 2 :(得分:0)
考虑到你没有使用任何malloc
,我只会回答你的问题:
每个现代操作系统都会在程序退出后恢复所有已分配的内存空间,所以是的,一旦它们超出范围就会被处理掉,你不必担心内存泄漏。
如果你不使用free()
它就没有坏处;除了你需要更多存储空间的运行时成本,这不是你的情况,因为你说你不想删除他们的数据指向。
但是对于良好的样式编码,最好尽快释放内存,因为你不再需要它了。