我一直试图解决这个问题,但不能完全理解它.
假设我在头文件中声明了一个对象,例如:
#ifndef SOMECLASS_H
#define SOMECLASS_H
#include "otherclass.h"
class SomeClass
{
public:
SomeClass();
OtherClass *obj;
};
#endif // SOMECLASS_H
Run Code Online (Sandbox Code Playgroud)
我可以在我的代码中执行以下操作吗?
obj = new OtherClass();
//Do something
delete obj;
obj = new OtherClass();
//Do something else
delete obj;
Run Code Online (Sandbox Code Playgroud)
或者我必须创建一个新的obj?
我无法想到我可能需要这样做的原因,但我想知道它是否会起作用以及它是否是一个好主意(我知道最好在堆栈上创建对象但是为了论证,让我们说在这种情况下它不是一个选项).
我认为你需要调整你正在发生的事情的心理模型.让我们看一个更简单的例子,我们没有这个SomeClass类:
int main() {
OtherClass *obj = new OtherClass();
delete obj;
obj = new OtherClass();
delete obj;
}
Run Code Online (Sandbox Code Playgroud)
第一行是这个函数是一个声明.此声明引入了一个名为obj其类型的对象OtherClass*.这里最重要的是,obj是只是一个指针.这不是一个OtherClass对象.它只保留一个地址.所以当你谈论这个对象时obj,你正在谈论指针.
这个声明有一个初始化器是= new OtherClass().该表达式 new OtherClass()还引入了一个对象,但这次它没有被命名.该对象具有类型OtherClass.表达式返回指向OtherClass您用于初始化的对象的指针obj.所以现在obj指针对象指向OtherClass对象.
这个内存模型看起来像这样:
obj
+-------------+ +------------+
| OtherClass* |----->| OtherClass |
+-------------+ +------------+
Run Code Online (Sandbox Code Playgroud)
现在,您可以在其生命周期中使用对象.生命周期obj是我们声明它的函数的范围.在函数结束时,obj超出范围并被销毁.也就是说,指针被破坏了.OtherClass对象的生命周期持续到我们使用delete指向它的指针为止.该delete只破坏OtherClass对象,而不是指针.所以在第一次之后delete,我们有这个:
obj
+-------------+
| OtherClass* |----->
+-------------+
Run Code Online (Sandbox Code Playgroud)
指针仍然存在.它仍然指向同一个地方,但那里的物体现在已经消失了.
此时,我们无法尝试使用该OtherClass对象,因为它不再存在.但是,我们当然可以重用指针对象obj.当我们这样做时obj = new OtherClass()(它是一个表达式,而不是一个声明),我们创建一个新OtherClass对象并设置obj为指向它.我们回到这种情况:
obj
+-------------+ +------------+
| OtherClass* |----->| OtherClass |
+-------------+ +------------+
Run Code Online (Sandbox Code Playgroud)
然后我们delete再来一次.
这个例子和你的例子之间的唯一区别是它obj是一个成员SomeClass.每个类型的对象都SomeClass将包含一个OtherClass*名为的指针obj.的寿命obj现在是不管的寿命SomeClass对象.只要该对象仍然存在,您就可以obj以任何您喜欢的方式使用它.当然,如果您delete指向的对象,则无法使用该对象.