在 DMA 之后反向更改为 int

Reverse changes to int after DMA

假设我在 class 中初始化了以下变量:

class testClass {
public:
    int someInt = 5;
};

并且我想像这样添加或修改它:

int main() {
    testClass *t = new testClass;
    cout << t->someInt << endl;
    t->someInt = 1;
    cout << t->someInt << endl;
    delete t;
    cout << t->someInt;
}

如何将 t->someIntsomeInt 所做的更改恢复到 int i = 5 的初始声明?

另外,当我在cout << t->someInt之前调用删除时仍然存在。为什么 t->someInt 的输出仍然等于 1?不应该被删除吗?

我正在开发一个有当前变量的游戏,我想在玩家获得分数时动态更改变量,例如分数,以释放内存并允许玩家在变量之后重玩游戏被退回。

为了让"t"没有值,你必须将它设置为nullptr。 (t = nullptr)

How can I revert the changes done by the t->someInt to someInt back to the initial declaration, of int i = 5?

您必须存储要还原的值的副本。您可以只存储 int 或整个 class.

的副本

例如,下面的代码将t的当前值存储在t_backup中:

int main()
{
    testClass *t = new testClass;
    cout << t->someInt << endl;

    testClass *t_backup = new testClass(*t);

    t->someInt = 1;
    cout << t->someInt << endl;

    *t = *t_backup;
    cout << t->someInt << endl;

    delete t_backup;
    delete t;
}

显然,如果您的 class 更复杂,您将不得不定义自己的复制构造函数和赋值运算符。

Also, when I call delete before cout << t->someInt still exists. Why does the output of t->someInt still equals 1? Shouldn't it have been deleted?

调用delete后,变量的任何使用都是"undefined behaviour"。这意味着(几乎)任何事情都可能发生。它可以打印数字,也可以使您的计算机崩溃。

有几种方法。

第一个也是最简单的方法是复制变量(或多个)。根据您所说的,这可能是您真正想要的。

int input1 = 1;
char input2 = 'a';

while (play_game(input1, input2))
    ;

这会重复调用 play_game,每次调用时,这两个变量都会以规定的值开始。 play_game 可以根据需要修改它们的本地副本,但一旦退出,这些更改就会消失。

如果您确实遇到需要修改对象的情况,然后 return 该对象恢复到其先前的值,您可能需要考虑 memento pattern.