【问题标题】:C++ Deleting a pointer to a object that contains another pointerC ++删除指向包含另一个指针的对象的指针
【发布时间】:2015-08-07 08:19:20
【问题描述】:

我们说

class A {
  A* array;
public:
   A (){ 
    array= new A [4];
  }

  ~A (){
    delete array;
  }
}

如果我们在堆上创建这样的对象,我们如何释放一个对象

A* object_ptr =new A();

我对释放指向包含另一个指针的对象的指针有点困惑.....

【问题讨论】:

    标签: c++ object dynamic-memory-allocation


    【解决方案1】:

    打电话

    delete object_ptr;
    

    之后

    A* object_ptr =new A();
    

    将调用object_ptr 指向的A 的析构函数。这意味着,如果你改正错误

    ~A (){
      delete array;
    }
    

    ~A (){
      delete[] array;
    }
    

    您的代码会很好,并且内部指针已正确释放。

    但是,您真的应该使用std::vector 而不是new[]。它会让你的生活轻松很多。如果您坚持使用new[],请阅读The Rule of Three

    【讨论】:

    • std::unique_ptr(如果可用)而不是“纯”指针
    【解决方案2】:

    有两点需要注意。

    1. 删除数组时应使用[]。例如:delete [] array;
    2. 删除指针时,将调用分配对象的析构函数。您可以从您的代码中调用:delete object_ptr; 来删除您的指针。

    另一个需要注意的重点是复制对象时会发生什么。如果您的对象曾经获得副本,您将遇到一个析构函数从另一个对象下删除指针的问题。这就是为什么shared_ptr 是原始指针的一个很好的替代品(请参阅this question,了解如何使用shared_ptr)。

    【讨论】:

    • 如果我将object_ptr分配给一个新的指针,会不会导致同样的问题?
    • 是的。如果你写:A *a = new A(); A *b = a; delete a;,那么b的内部array也会被删除。
    • 嗯..如果一个对象是由堆栈中的方法创建的,其字段之一是在堆中创建的,那么堆中的内存是否会被释放?
    • 是的,当对象超出范围时,将调用堆栈上对象的析构函数。
    • 我有一个程序返回A object ,并且由于某种原因,在方法之后,当对象返回另一个变量A new_object时,我仍然可以毫无问题地访问所有字段。而且我很困惑,因为它们应该在那时消失,因为它们是在堆栈中创建的......除非我使用 A new_object = some_method() 时分配运算符不同
    猜你喜欢
    • 2020-07-02
    • 2011-05-02
    • 2010-09-08
    • 2013-09-09
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多