这是我的一些碰撞检测代码。我使用指针来使我的代码更小,更具可读性(有问题的指针是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项目中使用这种方法,以使代码更直观,所以我担心可能的内存泄漏。
发布于 2018-05-31 16:38:54
我看不到动态内存分配(没有mallocs,也没有reallocs,只有堆栈中的局部变量,所以它们将根据它们的作用域进行管理),因为您不必释放未分配的动态内存(堆是空的)。
提示一下,为什么要使用大量的局部浮点型变量?这些值已经存在于thisBall
和otherBall
结构中。
编辑:如果myGs
是堆中的变量,则必须添加定义myGs
并管理其分配的代码。
发布于 2018-05-31 16:48:37
考虑到您没有使用任何malloc
,我将只回答您的问题:
每个现代操作系统都会在程序退出后恢复所有分配的内存空间,所以是的,一旦它们超出作用域,它们就已经被处理了,你不必担心内存泄漏。
如果你不使用free()
,它也不会有什么坏处;除了你需要更多存储空间的运行时成本,这不是你的情况,因为你说过你不想删除他们所指向的数据。但是对于良好的样式编码,最好在不再需要内存时尽快释放它。
https://stackoverflow.com/questions/50619870
复制相似问题