c++析构函数的问题

来源:百度知道 编辑:UC知道 时间:2024/05/13 03:38:25
既然都已经delete了,已经释放了内存,那么为什么还会在delete的同时自动调用析构函数,不是多此一举吗?
还有析构函数中一般需要delete语句吗?

记住这句话delete和new是一一对应的。

你说的第一句“我已经delete了,已经释放内存了为什么还要调用析构函数”
你已经delete只是针对你外面的new来说的,比如下面

ClassA a = new Class();
delete a;

这个是会释放a的内存空间。但是如果a是一个socket类或者数据库连接类,你这时候就要调用析构函数去关闭socket和数据库连接。

你的第二句“析构函数中一般需要delete语句吗?”
还是上面那句话,“new和delete是一一对应的”比如下面
classB
{
private:
char* m_ch;
public
ClassB(char* s, int len)
{
m_ch = new char[len + 1];
for (int i = 0; i < len; i++)
{
m_ch[i] = s[i];
}
m_ch[len] = '\0';
}

~ClassB()
{
if (m_ch != NULL)
{
delete m_ch;
m_ch = NULL;
}
}
}

这时候你必须在析构函数中释放资源,否则你构造函数中new的资源没有释放。

比如说,你的类里边有个char*你对它动态分配了内存,如果没有析构函数,你是不是要在Delete这个类的指针对象之前先Delete这个char*的内存?

现在有了析构函数,在析构函数中删除char*的内存。这样你之用delete一次就所有问题都搞定了,何乐而不为呢?

析构函数是在这个类的生命期结束后自动调用的
即使你不写系统也会给你产生个默认的。
析构函数内的是写 在这个类的对象即