【问题标题】:Destruct with a pointer to object使用指向对象的指针进行破坏
【发布时间】:2012-10-24 01:44:08
【问题描述】:

如果一个对象是这样存在的:

MyClass obj;

调用成员函数:

obj.myMemberFunction();

然后在该对象完成其目的后调用该对象的析构函数:

delete obj;

但是,假设我有一个指向对象的指针:

MyClass* obj;

调用成员函数:

obj->myMemberFunction();

现在...如何调用这个对象的析构函数?

【问题讨论】:

  • 相同。你不需要删除你的对象,在堆栈​​上创建的对象
  • 您不能为实例化为MyClass obj; 的对象调用析构函数 - 它被分配为自动变量,并且在退出范围时将自动调用析构函数。

标签: c++ pointers object destructor delete-operator


【解决方案1】:

你把它弄反了;在第二种情况下执行delete不是在第一种情况下:

MyClass obj;
obj.myMemberFunction();
//delete obj;
//^^^^^^^^^^^
// NO! `obj` has automatic storage and will
// be destroyed automatically when it goes out
// of scope.

delete 需要一个指向动态分配对象的指针:

MyClass* obj = new MyClass;
obj->myMemberFunction();
delete obj;

【讨论】:

  • 值得注意的是:除非您真的需要使用指针,否则您可能会避免使用它们。在大多数情况下使用普通对象,以便正确销毁它们。
【解决方案2】:

如果你用

创建它
MyClass obj;

你什么都不做来删除它。如果你用

创建它
MyClass* obj = new MyClass();

你使用

delete obj;

删除它。

【讨论】:

    【解决方案3】:

    operator delete 旨在与存储在堆上分配的区域的地址的指针一起使用,这要归功于相应的operator new

    void function () 
    {
      int * pt;
    
      pt = new int;
    
      *pt = 42;
    
      delete pt; // memory released
    }
    

    栈上分配的内存在对应作用域结束时自动释放:

    void function () 
    {
      int i;
    
      i = 42;
    
    } // memory released
    

    【讨论】:

      【解决方案4】:

      当您编写MyClass obj; 时,对象分配在堆栈上,而不是堆上。在这种情况下,对象会自动销毁,然后超出范围。编译器生成代码以确保调用析构函数。所以你不要明确删除对象。

      delete 在堆上分配对象时使用。例如:

      MyClass* pobj = new MyClass;
      // Do something with pobj...
      delete pobj;
      

      【讨论】:

      • 严格按照C++语言来说,物理存储位置不相关,但存储duration是相关的。那是“自动存储”/“动态存储”与这个“堆栈”/“堆”。那和delete的操作数的类型。
      • @Dabbler, s/MyClass pobj/MyClass *pobj/
      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2014-03-11
      • 2023-02-09
      • 2021-05-07
      • 1970-01-01
      • 2013-09-04
      • 2011-02-03
      相关资源
      最近更新 更多