在C ++中调用析构函数不会手动销毁对象

时间:2018-06-14 20:07:41

标签: c++ oop destructor

我想在C ++中显式调用对象的析构函数来销毁该对象。

这只是一个试验编程语言功能的简单程序。我有一个默认构造函数,它将内部数据成员设置为1,重载构造函数将内部数据成员设置为参数,以及析构函数,它显示刚刚销毁的对象的内部数据成员。还有一个打印内部数据成员的函数。

#include <iostream>
using std::cout;
using std::endl;

class myClass {
  public:
   myClass()
   {
     i = 1;
     cout << "default ";
     cout << "constructor called with " << this->i << endl;
   }

   myClass(int i)
   {
     this->i = i;
     cout << "constructor called with " << this->i << endl;
   }

   ~myClass()
   {
     cout << "object " << i << " destroyed!" << endl;
   }

   void printData()
   {
     cout << "object's data is " << i << endl;
   }
  private:
   int i;  // private data member
};

int main() {
  myClass a;
  myClass b;
  myClass c(8);

  a.printData();
  b.printData();
  c.printData();

  /* I want to explicitly destroy object b. */
  b.~myClass();
  b.printData();

  /* all the destructors get called when the objects go out of scope */

  return 0;
}

我的理由是这样的:我认为析构函数会导致对象被销毁,因此它不再存在于内存中。在我显式调用析构函数之后,我不再能够再次使用该对象,因为它已被销毁。但是,我能够调用对象的函数并打印内部数据成员的值。手动调用析构函数是否无法破坏对象?这里发生了什么? 输出:

default constructor called with 1
default constructor called with 1
constructor called with 8
object's data is 1
object's data is 1
object's data is 8
object 1 destroyed!
object's data is 1
object 8 destroyed!
object 1 destroyed!
object 1 destroyed!

调用析构函数会破坏对象,还是调用析构函数来破坏对象?

1 个答案:

答案 0 :(得分:1)

  

在我显式调用析构函数之后,我再也不能再使用该对象了,因为它被销毁了

那是对的。只有它的C ++,而不是&#34;你不再能够&#34;就像在&#34;当你做坏事时你会受到警告&#34;它更像是&#34;你可能会在未来任何随机点被击中,而不会发出警告你做坏事&#34; (又名&#34;未定义的行为&#34;)。

在您的特定示例中,您销毁对象,并且它在逻辑上不再存在。内存可能仍然被分配或甚至包含一些旧数据。但是,尝试访问它是未定义的行为。它可能是一种工作&#34;关于编译器,编译器标志,源代码,操作系统和月相的特定组合,它可能在以后有所不同,技术上甚至可能wipe your hard drive

此外,当您在局部变量中声明对象时,它会在超出范围时第二次自动销毁。这也是未定义的行为,但是您的程序行为已经完全未定义并不重要。

您可以尝试使用Valgrind,AddressSanitizer或UndefinedBehaviorSanitizer等动态分析来捕获这些内容,但它们不提供任何保证。