何时删除对象?创建对象对C++的影响。

3

我正在协助用c++为Nintendo DS编写游戏(它有约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
    }
}

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
一旦值对象(未使用new运算符)超出范围,它就会被销毁。该对象被放置在堆栈上。如果使用new运算符获取指向对象的指针,则必须在某个时候显式使用delete关键字将其从内存中删除。尽可能使用前者。它通常更快且更安全。它甚至可以比传统的垃圾收集更安全,因为您确切地知道何时发生事情。 - Ben
@dlf 已经修复了;当我重新输入简化代码时,不小心打错了一个字母 :)。 - Matthew D. Scholefield
2个回答

6
尽管你的术语有些欠缺,但你编写的代码将对象“分配在堆栈上”,因此只能持续到作用域结束。
事实上,你可以更加简洁地编写它:
//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语言有一个这样的信号)。因此,通常不建议在对象上使用您的“堆栈”。


许多实现都将堆栈增长到堆内存。有可能会溢出堆栈。大量的变量分配、递归函数调用或深层函数调用都是堆栈溢出的原因。 - Thomas Matthews
那么你的意思是由于栈大小有限,我只需要确保不同时使用太多对象,但如果它们不都在同一个作用域中,那就不会有问题了? - Matthew D. Scholefield
我会建议一般情况下避免使用栈,除非你需要用到它。它的作用是允许参数传递,特别是递归。如果你不在一个递归函数内部,除非它是像整数这样的东西,否则你可能不应该把它放在栈上。 - Blindy

6
是的,当对象超出范围时(即调用Button的析构函数),它们将被销毁。因此,在程序从函数titlescreen返回时,singlePlayermultiPlayer将被销毁。
只要Button的析构函数清理了所有内容,这些按钮在函数返回后不会影响RAM使用情况。
此外,您应该包含C++头文件cstdio,而不是c头文件stdio.h

请注意,动态分配的对象可能会导致内存碎片化。 - Thomas Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接