【问题标题】:How to manually destroy member variables?如何手动销毁成员变量?
【发布时间】:2012-02-08 04:00:37
【问题描述】:

我有一个关于析构函数的基本问题。

假设我有以下课程

class A
{
public:

int z;
int* ptr;

A(){z=5 ; ptr = new int[3]; } ;
~A() {delete[] ptr;};

}

现在析构函数应该销毁一个对象的实例。 上面的析构函数正是这样做的,它释放了由 new 分配的动态分配的内存。

但是变量z 呢?我应该如何手动销毁它/释放z分配的内存?当类超出范围时它会自动销毁吗?

【问题讨论】:

  • z 将被自动清理。您必须删除 ptr,因为它是堆分配的,但 z 没有分配在堆上。
  • 您在这里忽略了Rule of Three,只是为了提醒您。 :)
  • 好点!谢谢:D
  • 此外,使用std::vector 代替数组将避免必须定义析构函数以及三规则问题。

标签: c++ destructor


【解决方案1】:

它会自动“销毁”,尽管在您的示例中 int z 是 POD 类型,因此没有显式析构函数......内存只是被回收。否则,如果对象有析构函数,则在主类A 的析构函数主体完成但未退出后,将调用它以正确清理该非静态数据成员的资源。

【讨论】:

    【解决方案2】:

    z 被自动销毁。这发生在每个“自动”变量上。即使是int*float*some_class* 等指针。但是,当原始指针被销毁时,它们不会自动成为deleted。这就是智能指针的行为方式。

    由于该属性,人们应该始终使用智能指针来表达所有权语义。它们也不需要在复制/移动构造函数/赋值运算符中进行任何特别提及,大多数时候您甚至不需要在使用智能指针时编写它们,因为它们自己会做所有需要的事情。

    【讨论】:

    • int *ptr 这样的指针也有自动存储期限,并且会自动销毁。只是销毁指针不会在指针上调用delete
    【解决方案3】:

    销毁一个对象也会销毁该对象的所有成员变量。您只需要删除指针,因为销毁指针不会做任何事情 - 特别是它不会破坏指针指向的对象或释放其内存。

    【讨论】:

      【解决方案4】:

      事实上,当类超出范围时,它会自动销毁。猜测是否是这种情况的一个很好的方法是在其声明之后没有*

      【讨论】:

        【解决方案5】:

        对于整数、浮点数等 PODS(普通旧数据类型),它们会自动销毁。如果你有对象作为数据成员(例如std::string aStr;),它们的析构函数将被自动调用。您只需手动处理内存释放(如上)或任何其他手动对象或数据清理(如关闭文件、释放资源等)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-16
          • 1970-01-01
          • 2012-09-11
          • 2013-07-13
          • 2012-12-23
          • 1970-01-01
          • 2017-06-14
          • 2010-12-31
          相关资源
          最近更新 更多