3

我正在帮助 Nintendo DS 用 C++ 编写游戏(它有大约 3MB 的 RAM)。对于界面中的所有菜单,过去通过调用将背景图块设置为按钮的 void 函数来创建一个“按钮”。整个界面至少有 30 个按钮。现在我创建了一个按钮类来存储它的位置、标签以及其他数据值。现在我的问题是:

程序离开对象范围后,所有这些新按钮对象是否会影响 RAM 使用(或其他性能方面)?

或者一旦程序离开创建它的函数,对象会自动被丢弃吗?

这是一些代码:

#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
    }
}

按钮.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 */
4

2 回答 2

6

是的,对象在超出范围时被销毁(即Button调用 s 的析构函数)。所以singlePlayermultiPlayer将在程序从函数返回时被销毁titlescreen

所以,只要析构函数Button清理了所有东西,函数返回后按钮就不会影响RAM的使用。

此外,您应该包含 C++ 头文件cstdio而不是 c-header stdio.h

于 2014-06-26T20:09:03.967 回答
5

尽管缺少您的术语,但您编写的代码在“堆栈上”分配对象,因此只会持续与您的范围一样长。

其实你可以写得更简洁:

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

无论如何,您应该注意的一件重要事情是,由于您使用“堆栈”来保存对象,因此无论您是在“分配”还是“释放”它们,您的“RAM 使用”都不会改变。大多数实现中的“堆栈”是一块从不扩展的预先分配的内存块,当它填满时它只是抛出堆栈溢出异常(或你的框架等效,我认为 C 有一个信号?)。因此,通常在对象上使用“堆栈”是一个坏主意。

于 2014-06-26T20:11:53.947 回答