c++析构函数

c++析构函数分析 在 main 函数中创建了 t0 t1 t2 t3 几个对象 这里先说一下 C 创建对象的三种不同方式 1 Testp1 1 栈中分配内存 2 Testp2 Test 2 栈中分配内存 跟方法 1 相同 是方法 1 的完整模式 3 Test p3 newTest 3 堆中分配内存方法 1 2 中都是在栈中分配内存 在栈中内存由系统自动的去分配和释放 而使用 new 创建的指针对象是在堆中分

#include 
     using namespace std; class Test { 
    int id; public: Test() { 
    } Test(int i) { 
    id = i; } ~Test() { 
    cout<<"ID: "<<id<<" destruction function is invoked!"<<endl; }; }; int main() { 
    Test t0(0); //栈中分配  Test t1[3]={ 
   1,1,1}; //栈中分配  Test *t2 = new Test(2); //堆中分配 delete t2; Test *t3 = new Test[3]{ 
   3,3,3}; //堆中分配 delete []t3; cout<<"------End of Main-------"<<endl; return 0; } 

在给出运行结果以前有必要说一下,我在vs2012的编译器里也运行了这段代码。但是其中Test *t3 = new Test[3]{3,3,3};这行代码是有错误的,我去查阅了相关的博客资料发现,在C++11中引进了这一新功能,即用new申请动态数组时可以直接初始化,形式如下:

int* p = new int[cnt](); //其中cnt长度和int类型都可以自己定义。 int* p = new int[cnt]{ 
    }; 

而且可以用这个方式给每个成员赋值。

int* a = new int[10] { 
    1,2,3,4,5,6,7,8,9,10 }; 

所以说上面的Test *t3 = new Test[3]{3,3,3};语句就应该是没问题的,下面给出运行结果。
在这里插入图片描述
解释:
在main函数中创建了t0,t1,t2,t3几个对象,这里先说一下C++创建对象的三种不同方式:






1、Test t0(0; //栈中分配内存 2、Test t1[3]={ 
   1,1,1};       //栈中分配内存 3、Test *t2 = new Test(2);   //堆中分配内存 4、Test *t3 = new Test[3]{ 
   3,3,3};    //堆中分配内存 

方法1、2中都是在栈中分配内存,在栈中内存由系统自动的去分配和释放,而使用new创建的指针对象是在堆中分配内存,当不需要该对象时,需要我们手动的去释放(delete),否则会造成内存泄漏。

在上述程序中,t0和t1都是栈中的对象,在程序结束时由系统来释放,因此出现在—–End of Main—-之后。t2,t3是new出来的堆中对象,所以需要手动的delete释放,因此出现在最前面。另外有一点发现,就是栈中对象的释放顺序,是后定义的先释放,经过几次验证也如此,我想这恰好应征了栈的后进先出的特征。(先释放1,后释放0)

class Test { 
    int id; public: Test(int i) { 
    id = i; } ~Test() { 
    cout<<"ID: "<<id<<" destruction function is invoked!"<<endl; }; }; Test t0(0);   //最先创建的对象,最后释放 void Func() { 
    static Test t1(1); //创建静态对象,会在整个程序结束时自动释放 Test t2(2);             //在Func结束时自动释放 cout<<"-----Func-----"<<endl; } int main() { 
    Test t3(3); t3 = 10; //类型转换构造函数,这里会创建临时对象,将int型转成Test类型对象, //在赋值结束后,临时变量销毁 cout<<"------Begin of Main-------"<<endl; { 
    Test t4(4); //花括号代表作用域,不需要等到main方法结束就释放了 } Func(); //进入Func函数 cout<<"------End of Main-------"<<endl; return 0; } 

那让我们先分析一波 先是t3,t3创建完成以后想要把10赋值过来,但是一个是int类型,一个是Test,这里就会创建临时对象,将int型转成Test类型对象,在赋值结束后,临时变量销毁(把临时创建的对象得10赋值给了t3),销毁临时对象,调用一次析构函数,然后是——Begin of Main——-,到了t4,因为是在花括号里,直接调用了一次析构函数,不需要等到main方法结束,(此处如果没有花括号那么它应该在哪里呢,答案当然是在t3前面 也就是——End of Main——-之后的10前面),到了Func(); 里面的t1和t2,t1静态对象,会在整个程序结束时自动释放,t2在Func()结束时释放,所以先——Func——在调用析构函数,然后——End of Main——-,接着是释放t3,静态t1,最前面最先定义的t0;

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217984.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:19
下一篇 2026年3月18日 上午8:19


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号