【问题标题】:How to delete this object?如何删除这个对象?
【发布时间】:2016-11-19 05:06:03
【问题描述】:

我已经声明了一个带有构造函数和析构函数的简单类。但是,当我删除对象时,它会给出runtime error 并且不再执行输出。

class Student {
public:
    string name;

    Student(string name) {
        this->name=name;
    }

    ~Student() {
        this->name="";
    }

};

int main() {
    Student* s = new Student("a");
    cout<<s->name<<endl;
    delete s;                                 /// Problem In This Line
    cout<<"Name Here -> "<<s->name<<endl;
    return 0;
}

我的问题是什么?我应该如何删除或调用析构函数?

【问题讨论】:

  • 删除指针后就不能使用了。
  • 谢谢。我得到了它。 @代码学徒

标签: c++ destructor


【解决方案1】:

删除指针后,您将无法使用它。如果你想证明你的析构函数有效,请将 cut 语句放在其中而不是 main() 中。

【讨论】:

    【解决方案2】:

    我的问题是什么?我应该如何删除或调用析构函数??

    在你delete s 之后,该对象就消失了,所以你当然不能再访问它了。在其生命周期之外访问对象是一种典型的未定义行为。

    对于您的情况,只需重新排序您的代码即可。

    cout<<"Name Here -> "<<s->name<<endl;
    delete s;
    

    【讨论】:

      【解决方案3】:

      正如@Code-Apprentice 所说。销毁对象后,为该目的分配的内存将被释放,因此在您的示例中,您试图访问一块未分配的内存,这会导致所谓的 NPE (NullPointerException)。

      【讨论】:

      • C++ 中没有 NullPointerException 并且指针指向某个东西,它不是 null
      • NullPointerException 是描述指向 null 的潜在错误的一种方式。我忘了说这个异常在 Java 中就是这么叫的。尽管如此,你是对的。使用删除后,内存被释放并准备再次使用,就是这样。说它指向 null 是错误的,因为这是建议在销毁 object 之后手动完成的事情。我在此评论中更正了自己,并添加了一个相关的有趣主题。 *.com/questions/11603005/…
      【解决方案4】:

      既然你已经删除了指针,调用它就像去一个特定的目标地址,那里什么都没有,并期望它做某事。当指针超出范围时,您可以依靠析构函数自动重新分配堆中的内存。

      【讨论】:

        【解决方案5】:

        从堆中删除后无法调用。所以如果你想用这条线

        cout&lt;&lt;"Name Here -&gt; "&lt;&lt;s-&gt;name&lt;&lt;endl;

        在删除Student 对象s 之前,您应该按照其使用的方式重组您的程序

        【讨论】: