c++中delete和析构函数之间的区别

delete=1.调用析构函数,释放对象中的成员资源

            2.归还对象空间(free)

其中在调用析构函数的时候,有可能还会对其他对象进行delete,然后调用这个对象的析构函数。。。

看这个例子:

转载原文地址:

https://www.cnblogs.com/wycnb/p/4664934.html

delete用于释放new在堆中动态生成的对象空间。
释放时会自动调用类的析构函数,在析构函数中用于释放类内部动态分配的得到的资源。

然后delete再释放整个对象所占的内存空间
simple:
#include <iostream>
using std::cout;
using std::endl;
class Simple{
public:
Simple(){
p = new int; //使用new分配空间
*p = 10;
pArray = new int[*p]; //使用new分配数组空间
for(int i = 0; i < *p; i++)
pArray[i] = i;
}
~Simple(){
cout << "\ndisconstuctor\n" << "now delete p" << endl;
delete p;
cout << "now delete pArray" << endl;
delete [] pArray; //注意这里的释放配对

}
public:
void out(){
cout << "p value = " << *p << endl;
for(int i = 0; i < *p; i++)
{
cout << "array is " << *(pArray + i) << endl;
}
}
private:
//disable copy & assign control
Simple(const Simple&);
const Simple& operator=(const Simple&);
private:
int *p;
int *pArray;
};
int main()
{
Simple* s = new Simple; //生成堆对象
s->out();
delete s; //释放对象

//delete s的过程中首先调用析构函数~simple()释放成员资源,然后释放对象的空间

//在~simple()的过程中:因为simple()的过程中,有开辟新空间,所以这个必须delete,如果这个过程中没有new,那么这里也没必要delete,在这个delete的过程中,也调用了int这个类的析构函数,在int这个类里的析构函数中,首先释放成员资源,然后释放空间,当整个对象中的成员资源被释放之后,等于是该对象的析构函数执行完毕。然后delete释放整个对象的空间。


return 0;
}

而delete this如果发生在析构函数中,每次delete---->调用析构函数,析构函数又delete this导致了堆栈内存。。。

如果是发生在成员函数中,之后如果不用到成员资源(比如某个成员变量和虚函数)可以,如果用到,会报错,因为这块资源已经被释放掉,找不到数据了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
delete函数C++的两个概念,它们在对象的生命周期起着不同的作用。 delete是用于释放动态分配的内存的操作符。在C++,通过new关键字可以动态地创建对象,并将其存储在堆区。当对象不再需要时,可以使用delete操作符将其销毁,并释放所占用的内存空间。如果没有使用delete来释放内存,就会导致内存泄漏,即程序无法再次使用这块内存空间。 函数是一个特殊的成员函数,用于在对象销毁时执行清理工作。当对象的生命周期结束时,函数会自动被调用。在函数,可以释放对象所占用的资源,例如关闭文件、释放内存等。函数的名称与类名相同,前面加上一个波浪号(~)作为标识。 下面是一个示例,演示了delete函数的使用: ```cpp #include <iostream> class Employee { private: int id; std::string name; public: Employee(int empId, std::string empName) { id = empId; name = empName; std::cout << "Employee " << name << " created." << std::endl; } ~Employee() { std::cout << "Employee " << name << " destroyed." << std::endl; } }; int main() { Employee* emp = new Employee(1, "John"); // 使用delete释放内存 delete emp; return 0; } ``` 在上面的示例,我们创建了一个名为Employee的类,它具有id和name两个成员变量。在main函数,我们使用new关键字动态地创建了一个Employee对象,并将其存储在堆区。然后,我们使用delete操作符释放了这块内存空间。在对象销毁时,函数被自动调用,输出了相应的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值