【问题标题】:How to delete class object in C++? [closed]如何在 C++ 中删除类对象? [关闭]
【发布时间】:2021-01-26 20:00:52
【问题描述】:

我有一个名为 City 的类,它的对象依赖于 3 个变量:string name, int area, int population 和一个构造函数。 我有一个析构函数,看起来像这样City::~City() {}

在 main.cpp 中,我正在创建一个像这样的对象:City city1 = City("New York", 123, 100000)

之后我想删除我创建的对象city1,我正在尝试:

  1. city1.~City(); - 没有任何反应

  2. delete city1;delete[] city1; - Cannon 删除“城市”类型的表达式

  3. delete [city1]; - 预期的 lambda 表达式主体

我应该怎么做才能删除类对象?我应该以某种方式更改析构函数吗?

【问题讨论】:

  • 请发minimal reproducible example。如何删除一个实例很大程度上取决于它是如何构造的。顺便提一句。每本合理的 C++ 书籍都应该提到这个话题…… ;-)
  • 您从未使用new 获取对象,因此delete 没有任何内容。
  • 第二眼看到City city1 = City("New York", 123, 100000)。在这种情况下,不要删除它。当您离开范围时,它会自动删除。
  • 您根本不应该尝试删除它 - 该对象将被自动销毁。您可能应该投资good book

标签: c++ class oop constructor destructor


【解决方案1】:

如果您像这样声明City 对象:

{
  City city1 = City("New York", 123, 100000);
  // ...

那么删除这个对象的正确代码是:

}

由于 c++ 对具有自动存储持续时间的对象进行确定性销毁(如 city1 的情况),因此一旦超出范围就会被正确清理。

一般来说,这需要正确编写City 的析构函数,但在您的情况下,由于它只包含一个string 和2 个ints,隐式析构函数会做正确的事情。

【讨论】:

    【解决方案2】:

    删除类对象应该怎么做?

    取决于您如何创建实例。自动、静态和线程本地存储中的对象以及临时对象会自动销毁。所有变量都具有这些存储类之一。

    动态对象必须显式销毁。通常,删除动态分配对象的理想方法是将所有权转移给智能指针,智能指针在智能指针被销毁时删除指向的对象。

    City city1 = City("New York", 123, 100000)
    

    这是一个变量。因此,对象会自动销毁。

    我应该以某种方式更改析构函数吗?

    取决于类的职责。通常,理想的类设计是不需要用户定义的析构函数。


    我正在尝试:

    • city1.~City(); - 没有任何反应

    在您的情况下,这很可能是错误的。如果你不创建另一个实例来代替被销毁的实例,那么当变量被销毁时程序的行为将是不确定的。

    delete city1;delete[] city1; - Cannon 删除“城市”类型的表达式

    city1不是指针,所以不是可以删除的东西。

    delete [city1]; - 预期的 lambda 表达式主体

    C++ 中没有这样的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2013-09-09
      • 1970-01-01
      相关资源
      最近更新 更多