没有引用的对象的内存会自动清除吗?
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
对象不应该负责删除它们自己。你应该有其他东西来管理 Test
s。实际上你应该使用智能指针,虽然没有你可以使用这样的东西:
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
,而你想创建不同子类的实例,这可能是另一个问题的问题。
我知道,这是一个愚蠢的问题,但我有几个 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
对象不应该负责删除它们自己。你应该有其他东西来管理 Test
s。实际上你应该使用智能指针,虽然没有你可以使用这样的东西:
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
,而你想创建不同子类的实例,这可能是另一个问题的问题。