189 8069 5689

[c++]关于拷贝构造函数和析构函数执行次数的思考

前言

最近在学习C++的类如何构造,在W3Cschool上看到关于拷贝构造函数的一个例子,记录一下。

成都创新互联公司-专业网站定制、快速模板网站建设、高性价比南州晴隆网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式南州晴隆网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖南州晴隆地区。费用合理售后完善,十多年实体公司更值得信赖。

案例背景

这篇文章大致是构造了如下的一个Line类:

class Line{
    public:
        int getLength(void);
        Line(int len);          // 简单构造函数
        Line(const Line &obj);  // 拷贝构造函数
        ~Line();                // 析构函数

    private:
        int *ptr;   //指向length
};

其中构造函数和析构函数的定义如下:

  • 简单构造函数:
Line::Line(int len){
    cout<< "Normal constructor allocating ptr." <
  • 拷贝构造函数:
Line::Line(const Line &obj){
    cout<< "Copy constructor allocating ptr." <
  • 析构函数(在对象被销毁时执行):
Line::~Line(void){
    cout<< "Freeing memory!"<
  • 获取Line对象的长度,直接返回指针指向的int类型数据
int Line::getLength(void){
    return *ptr;
}
  • 定义一个display函数,用于输出Line对象的长度:
void display(Line obj){
    cout<< "Length of line : "<

正文

对于以下main函数的内容:

int main(){
    Line line1(10);
    Line line2(line1);  //这里调用了拷贝构造函数

    display(line1);
    display(line2);

    return 0;
}

预期的输出是:

Normal constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Length of line : 10
Freeing memory!
Freeing memory!

但实际输出是:
拷贝构造函数析构函数被调用了好几次

Normal constructor allocating ptr.
Copy constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
Freeing memory!

分析

在设置断点和调试代码之后,发现原因:

  • display函数的函数参数是值传递,也就是说在调用时会创建函数参数(Line对象)的副本,并且display函数执行完之后,副本会被删除。
  • 也就是说,每执行一次display函数,都会触发对拷贝构造函数析构函数的调用,就会输出如下的文本:
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
  • 而输出结尾的两个Freeing memory!是由于C/C++的局部变量是存储在栈区stack的。栈区由编译器自动分配和释放内存。
  • 当程序执行到return 0;的时候,局部变量line1line2被销毁,故析构函数被调用。
  • 并且需要注意的是,这两个输出的顺序是:
Freeing memory!		--> 对应line2的销毁
Freeing memory!		--> 对应line1的销毁
  • 这是因为变量是存储在栈区中的,遵循FILO(First In, Last Out)的顺序。

本文标题:[c++]关于拷贝构造函数和析构函数执行次数的思考
网站地址:http://cdxtjz.cn/article/dsoigip.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。