【发布时间】: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一直存在到析构函数结束。请停止使用_tmain和TCHAR,这些是Windows 95 的残余,2020 年应该没有人需要它们了。 -
你有错误的期望。当破坏者的尸体被处决时,成员仍然非常活跃。如果他们不是,那就太糟糕了。当您的析构函数用于关闭数据库连接时,它用于 DB 句柄的成员必须在析构函数的主体内仍然有效。
-
基本数据类型不会被破坏。您的问题建立在错误的假设之上。
-
你能指出任何导致你期待这种行为的资源吗?如果是这样,我们或许能够澄清您似乎有的一些误解。
-
请注意,析构函数中的
std::cout << "Deleted" << endl;会造成误导。应该是std::cout << "Destroyed" << endl;。当自动对象超出范围时,它会被销毁;当new T创建的指针传递给delete ptr;时,它会被删除,而它指向的对象也会被销毁。
标签: c++ destructor