【问题标题】:How to observe c++ destructor destroys basic data types?如何观察c++析构函数破坏基本数据类型?
【发布时间】:2020-12-25 01:00:18
【问题描述】:

我有两个类,一个是main,另一个是Test,对于Test类,我有Test.cpp和Test.h


//-----Test.h--------//
#pragma once
class Test
{
private:
    int num;
public:
    Test(void);
    Test(int n);
    ~Test(void);
};



//------Test.cpp------//

#include "Test.h"

#include<iostream>
using namespace std;


Test::Test(void)
{
}

Test::Test(int n)
{
    num = n;
}

Test::~Test(void)
{
    cout << "Deleted" << endl;
    cout << "num = " << num << endl ;
}


//---------main.cpp--------------//


#include "Test.h"

#include<iostream>
using namespace std;

int main()
{
    Test t1 = Test(5);
    return 0;
}

我期望的输出是

已删除

num = 0

但实际输出是

已删除

num = 5

为什么会发生这种情况,为什么要使用析构函数来释放内存 或 dint 删除基本数据类型,如何删除变量, 使用什么方法可以观察到基本数据类型被删除?

【问题讨论】:

  • 您无法从程序中观察到基本类型的破坏。一个对象要么是活的,要么是死的。如果访问死对象,则行为未定义。不保证您会得到零或任何其他值。你可能会得到一个零,你可能会得到一个随机值,你可能会在你的脸上爆炸。在您的示例中,num 一直存在到析构函数结束。请停止使用_tmainTCHAR,这些是Windows 95 的残余,2020 年应该没有人需要它们了。
  • 你有错误的期望。当破坏者的尸体被处决时,成员仍然非常活跃。如果他们不是,那就太糟糕了。当您的析构函数用于关闭数据库连接时,它用于 DB 句柄的成员必须在析构函数的主体内仍然有效。
  • 基本数据类型不会被破坏。您的问题建立在错误的假设之上。
  • 你能指出任何导致你期待这种行为的资源吗?如果是这样,我们或许能够澄清您似乎有的一些误解。
  • 请注意,析构函数中的std::cout &lt;&lt; "Deleted" &lt;&lt; endl; 会造成误导。应该是std::cout &lt;&lt; "Destroyed" &lt;&lt; endl;。当自动对象超出范围时,它会被销毁;当new T 创建的指针传递给delete ptr; 时,它会被删除,而它指向的对象也会被销毁。

标签: c++ destructor


【解决方案1】:

对象的破坏并不意味着将值设置为零。那将是不必要的工作。相反,所需要的只是释放资源。位通常保持原样(在您的示例中表示 5),除非有令人信服的理由不这样做。

此外,成员在类之后被销毁。在您的示例中,首先运行~Test() 以销毁t1,然后t1.num 将被销毁。 Test的析构函数无法查看Test::num的析构。

【讨论】:

    【解决方案2】:

    为什么要使用析构函数,释放内存或删除基本数据类型

    您没有在堆中分配任何内存,因此无需释放任何内容。

    您所拥有的只是一个基本类型int,它不需要任何内存释放。

    如果你有一些指针成员变量:

    private:
        int* num;
    

    你在构造函数中的某个地方分配了它:new int(6); 然后确保你必须在你的析构函数中释放/释放它。

    【讨论】:

      【解决方案3】:

      在这种情况下,共享指针可能会有所帮助,它会在析构函数之后自动销毁:

      std::shared_ptr<int> num;
      

      但它必须被构造,在你需要的构造函数中:

      Test::Test(int n)
      : num(std::make_shared<int>(n)
      {
          // *n == 100
      }
      

      要查看数据是否被删除,请使用 Valgrind

      【讨论】:

        猜你喜欢
        • 2011-04-30
        • 2022-01-23
        • 2013-04-12
        • 2010-09-22
        • 2013-09-27
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多