没有引用的对象的内存会自动清除吗?

Does the memory of an object with no reference get cleared automatically?

我知道,这是一个愚蠢的问题,但我有几个 classes 扩展了另一个 class,并且我有一个变量 (Test* currentTest),其中我有classes 之一的一个实例被保存。它总是更改变量中的内容,经过一些更改后,整个程序就会崩溃(重新启动或只是冻结),我想知道内存是否真的被自动清除了,或者我只是愚蠢。

编辑:这是测试草图。它可以正常工作几秒钟,但随后崩溃(可能是因为 RAM 已满)。这就是 基本上 我的程序正在做的事情,只是有更多 classes 和更新实际做某事的函数。

class Test {
  public:
    virtual void update();
};
void Test::update() {}

class TestA : public Test {
  public:
    virtual void update();
  private:
    int a = 0;
    int abc[50]; // allocate a lot of memory, just like in the actual program
};

class TestB : public Test {
  public:
    virtual void update();
  private:
    int a = 0;
    int abc[20]; // allocate a lot of memory, just like in the actual program
};

Test* currentTest;

void setup() {
  Serial.begin(9600);
  currentTest = new TestA();
  Serial.println("Start!");
}

void loop() {
  currentTest->update();
  delay(100);
}

void TestA::update() {
  Serial.println("Running A");
  a++;
  if(a >= 5) {
    currentTest = new TestB();
  }
}

void TestB::update() {
  Serial.println("Running B");
  a++;
  if(a >= 5) {
    currentTest = new TestA();
  }
}

没有。可能你需要 std::shared_ptr<>

您正在泄漏内存,直到 运行 内存不足。每个 new 应该有一个 delete。如果我们只查看 update 方法而忽略所有其他方法,则在分配新方法之前,您应该 delete 旧的 currentTest

void TestA::update() {
  Serial.println("Running A");
  a++;
  if(a >= 5) {
    delete currentTest;
    currentTest = new TestB();
  }
}

但是,我们不能忽视剩下的一切! currentTest 是指向当前对象的指针,如果不 运行 遇到问题,则不能从成员函数中调用析构函数。 Test 对象不应该负责删除它们自己。你应该有其他东西来管理 Tests。实际上你应该使用智能指针,虽然没有你可以使用这样的东西:

struct TestManager {
     Test * test = nullptr;
     int counter = 0;
     void update() {
          if (test) {
              test->update();
              ++counter;
          }
          if (test && counter == 5) {
              delete test;
              test = new TestA;
          }
     }
 };

但是,与其手动管理原始指针,不如使用智能指针。在上面我总是创建一个 TestA,而你想创建不同子类的实例,这可能是另一个问题的问题。