我可以重用我删除的变量或对象吗?

Mat*_*ins 0 c++

我一直试图解决这个问题,但不能完全理解它.

假设我在头文件中声明了一个对象,例如:

#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

我无法想到我可能需要这样做的原因,但我想知道它是否会起作用以及它是否是一个好主意(我知道最好在堆栈上创建对象但是为了论证,让我们说在这种情况下它不是一个选项).

Jos*_*eld 7

我认为你需要调整你正在发生的事情的心理模型.让我们看一个更简单的例子,我们没有这个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指向的对象,则无法使用该对象.

  • 但是..你有多少空闲时间!(: (2认同)