Обработка ресурсов дубликата указателя в C - PullRequest
0 голосов
/ 31 мая 2018

Это мой код для обнаружения столкновений.Я использую указатель, чтобы сделать мой код меньше и более читаемым (рассматриваемый указатель 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, чтобы сделать код более интуитивным, поэтому я беспокоюсь о возможных утечках памяти.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Я не вижу динамического выделения памяти (без malloc, или realloc, только локальные переменные в стеке, поэтому они будут управляться в соответствии с их областью действия), учитывая, что вам не нужно освобождатьвыделенная динамическая память (ваша куча пуста).

Подсказка, почему вы используете много локальных переменных с плавающей запятой?Значения уже находятся в структурах thisBall и otherBall.

Редактировать: Если myGs является переменной в куче, необходимо добавить код, в котором определено myGs, и его распределениеуправление.

0 голосов
/ 31 мая 2018

, учитывая, что вы не использовали malloc, я просто отвечу на ваши вопросы:

каждая современная операционная система восстановит все выделенное пространство памяти после выхода из программы, так что да, они уже будут обработаныкак только они выходят из области видимости, и вам не нужно беспокоиться об утечках памяти.

И если вы не используете free(), это не принесет вреда, кроме затрат времени выполнения при наличии большего объема памяти, чем вам нужно.это не ваш случай, так как вы сказали, что не хотите удалять данные, на которые они указывают.Но для хорошего стилевого кодирования лучше освободить память, как только она вам больше не нужна.

0 голосов
/ 31 мая 2018
    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, потому что это "мертвая запись": thisBall не используется после этой строки (и его нельзя использовать, поскольку его время жизнизаканчивается на }), поэтому нет необходимости устанавливать его на что-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...