2014-06-26 3 views
3

Я помогаю программе игры в C++ для Nintendo DS (у нее около 3 МБ ОЗУ). Для всех меню в интерфейсе используется «кнопка», вызываемая функцией void, которая устанавливает фоновые фрагменты на кнопку. В интерфейсе имеется по меньшей мере 30 кнопок. Теперь я создал класс кнопок, который сохранил свою позицию, метку вместе с другими значениями данных. Теперь у меня вопрос:Когда объекты удаляются? Воздействие создания объектов C++

Все ли новые объекты кнопки влияют на использование ОЗУ (или другие аспекты производительности) после того, как программа покинет область действия объекта?

Или объект автоматически будет отброшен после того, как программа покинет функцию, в которой она была создана?

Вот код:

#include "Button.h" 

void titlescreen() //Called to create main menu 
{ 
    Button singlePlayer = Button(4, 5, "Single Player"); 
    //Creates button at coord (4,5) 

    Button multiPlayer = Button(4, 8, "Multi Player"); 
    bool chosen = false; //Whether an option has been clicked 

    while(!chosen) 
    { 
     //Menu stuff here 
    } 
} 

button.h:

#include <stdio.h> 
#ifndef BUTTON_H 
#define BUTTON_H 

class Button 
{ 
public: 
    int length; 
    int x, y; 
    bool isColored; 
    void setColored(bool); 
    void setDefault(); 
    button(int, int, const char * const); //Constructor 
    button(int, int, const char * const, int); //Constructor 
}; 


#endif /* BUTTON_H */ 
+2

'Button' в представленном коде создаются с автоматическим хранилищем и поэтому будут освобождены при возвращении 'titlescreen()'. – dlf

+1

Но это должно быть 'class Button' (с капиталом« B »)? – dlf

+0

Как только объект значения (без использования нового оператора) выходит из области видимости, он уничтожается. Объект помещается в стек. Если новый оператор используется для получения указателя на объект, он должен быть явно удален с ключевым словом delete в какой-то момент, который должен быть удален из памяти. Используйте прежний КОГДА ВЫ можете. Это быстрее и безопаснее. Это также может быть даже безопаснее, чем обычная сборка мусора, потому что вы знаете ТОЧНО, когда что-то происходит. – Ben

ответ

5

Хотя вашей терминологии не хватает, код, который вы написали, выделяет объекты «в стеке» и поэтому остается только до тех пор, пока ваша область действия.

В самом деле, вы можете написать его еще более лаконично:

//Button singlePlayer = Button(4, 5, "Single Player"); // bad, uses the copy constructor 
Button singlePlayer(4, 5, "Single Player");    // uses just a constructor call 

В любом случае важная вещь, которую вы должны быть осведомлены о том, что, поскольку вы используете «стек» для хранения ваших объектов, независимо от того, или нет вы «распределяете» или «освобождаете» их свое «использование ОЗУ» не изменится. «Стек» в большинстве реализаций представляет собой заранее выделенный фрагмент памяти, который никогда не расширяется, он просто выдает исключения переполнения стека (или ваш эквивалент структуры, я думаю, что C имеет сигнал для него?), Когда он заполняется. Поэтому, как правило, использование вашего «стека» на объектах - плохая идея.

+0

Многие реализации имеют стек, растущий в направлении памяти кучи. Существует возможность переполнения стека. Большое количество переменных allocm, рекурсивных вызовов функций или глубоких вызовов функций является источником переполнения стека. –

+0

Итак, вы говорите, что из-за ограниченного размера стека я просто должен не использовать слишком много объектов одновременно, но если они не все в одной области, это не должно быть проблемой? –

+0

Я бы сказал, вообще, чтобы избежать стека за все, для чего вам не нужен стек. Его цель - разрешить передачу параметров и, в частности, рекурсию. Если вы не находитесь внутри рекурсивной функции, вы, вероятно, не должны помещать ее в стек, если это не похоже на целое число или что-то в этом роде. – Blindy

6

Да, объекты разрушаются, когда они выходят из области видимости (т.е. деструктор Button с называются). Таким образом, singlePlayer и multiPlayer будут уничтожены, когда программа вернется из функции titlescreen.

Итак, до тех пор, пока деструктор Button очищает все, кнопки не влияют на использование ОЗУ после возвращения функции.

Кроме того, вы должны включить заголовочный файл C++ cstdio вместо c-header stdio.h.

+0

FYI, динамически распределенные объекты могут привести к фрагментации памяти. –