c++中析构函数释放空间顺序问题

转载 2018年04月17日 05:04:47
对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

#include<iostream>  
using namespace std;  
class point  
{  
private:  
    int x,y;//数据成员  
public:  
    point(int xx=0,int yy=0)//构造函数  
    {  
        x=xx;  
        y=yy;  
        cout<<"构造函数被调用"<<endl;  
    }  
    point(point &p);//拷贝构造函数,参数是对象的引用  
    ~point(){cout<<"析构函数被调用"<<endl;}  
    int get_x(){return x;}//方法  
    int get_y(){return y;}  
};  
  
point::point(point &p)  
{  
    x=p.x;//将对象p的变相赋值给当前成员变量。  
    y=p.y;  
    cout<<"拷贝构造函数被调用"<<endl;  
}  
  
void f(point p)  
{  
    cout<<p.get_x()<<"  "<<p.get_y()<<endl;  
}  
  
point g()//返回类型是point  
{  
    point a(7,33);  
    return a;  
}  
  
void main()  
{  
    point a(15,22);  
    point b(a);//构造一个对象,使用拷贝构造函数。  
    cout<<b.get_x()<<"  "<<b.get_y()<<endl;  
    f(b);  
    b=g();  
    cout<<b.get_x()<<"  "<<b.get_y()<<endl;  
}  
构造函数被调用 //point a(15,22);
拷贝构造函数被调用 //point b(a);拷贝构造函数的第一种调用情况:用类的一个已知的对象去初始化该类的另一个对象时
15 22 //cout<<b.get_x()<<" "<<b.get_y()<<endl;
拷贝构造函数被调用 //f(b);拷贝构造函数的第二种调用情况:函数的形参是类的对象,调用函数进行形参和实参的结合时
15 22 //void f(point p)函数输出对象b的成员
析构函数被调用 //f(b);析构函数的第一种调用情况:在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被自动调用
构造函数被调用 //b=g();的函数体内point a(7,33);创建对象a
拷贝构造函数被调用 //b=g();拷贝构造函数的第三种调用情况,拷贝a的值赋给b:函数的返回值是类的对象,函数执行完返回调用者

析构函数被调用 //拷贝构造函数对应的析构函数
析构函数被调用 //b=g();的函数体内对象a析构
7 33
析构函数被调用 //主函数体b对象的析构
析构函数被调用 //主函数体a对象的析构

c++ 内存申请释放,构造函数,析构函数,执行顺序

内存释放,申请与析构,构造函数 这几个函数的执行顺序是什么,我们已经知道对于普通的对象,会先执行内存申请函数,然后执行构造函数,然后执行析构函数,最后执行内存释放函数。 但是,对于有继承关系的对象...
  • nilbooy
  • nilbooy
  • 2016年05月14日 09:48
  • 635

[c++]怎么样知道析构函数先后的析构顺序

#include #include using namespace std; class String_date { private: char * str; public: Stri...
  • cherry_ermao
  • cherry_ermao
  • 2015年03月28日 11:24
  • 815

关于在析构函数中释放内存

当你提供的API需要分配内存时,可以考虑创建一个对象保存新分配内存的地址,然后在对象析构时释放内存。这样用户不用担心忘记释放内存。 需要注意的是,如果用户创建了这种对象并得到新分配的内存地址后,并不...
  • hongjunbj
  • hongjunbj
  • 2012年12月07日 17:40
  • 669

析构函数与内存释放

析构函数和内存释放,有一篇的总结,因为内容长,以后贴上来先看个简易的class A{public:    A(int i = 3){a = i;};    ~A(){cout     int valu...
  • todototry
  • todototry
  • 2007年01月09日 10:45
  • 4256

C++_的引用的析构,引用空间的释放

今天遇到一个问题,C++中的引用变量,如果引用被析构,原数据是否会存在,例如 int a = 5; int& b = a;  delete &b; a是否能被访问到,博主写了个测试程序。 经测试,数...
  • u010003835
  • u010003835
  • 2015年10月29日 21:36
  • 1078

C++ 析构函数执行顺序

通过 Student 类依次创建了3个对象,分别是 stu1、stu2、stu3,但它们对应的析构函数的执行顺序却是相反的,这是为什么呢? 要搞清楚这个问题,首先要明白C++内存模型,也就是C+...
  • csdn_chai
  • csdn_chai
  • 2017年09月01日 09:50
  • 193

C++多个类中构造函数与析构函数的调用顺序

C++中有一个很重要的法则:使用构造函数创建对象的顺序与使用析构函数释放对象的顺序相反。对于一些C++的初学者来说,这是一条有点费解的法则,那么该怎么理解和清晰的表现出来呢?下面我们通过程序来体现一下...
  • casky237
  • casky237
  • 2017年01月14日 22:33
  • 1293

C++指针释放问题

今天看到了一个问题,其实在项目中也经常遇到指针释放的问题,先看看一个简单的指针释放的问题: **************************************问题如下: (1)一般在c++...
  • u011473714
  • u011473714
  • 2016年03月02日 22:46
  • 3559

C++继承中构造函数、析构函数调用顺序及虚析构函数

C++继承中构造函数、析构函数调用顺序及虚析构函数 首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数...
  • u012861978
  • u012861978
  • 2016年02月16日 11:29
  • 1354

总结笔记-c++成员变量、构造函数以及析构函数的执行顺序

在我的之前的博客http://blog.csdn.net/caoyan_12727/article/details/52356844有提到c++各种变量的初始化规则,本文将总结c++中涉及到的各种变量...
  • caoyan_12727
  • caoyan_12727
  • 2016年09月03日 12:14
  • 1276
收藏助手
不良信息举报
您举报文章:c++中析构函数释放空间顺序问题
举报原因:
原因补充:

(最多只允许输入30个字)