[c++]关于拷贝构造函数和析构函数执行次数的思考
2022/8/6 1:52:48
本文主要是介绍[c++]关于拷贝构造函数和析构函数执行次数的思考,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
最近在学习C++的类如何构造,在W3Cschool上看到关于拷贝构造函数的一个例子,记录一下。
案例背景
这篇文章大致是构造了如下的一个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." <<endl; // 为指针分配内存 ptr = new int; *ptr = len; }
- 拷贝构造函数:
Line::Line(const Line &obj){ cout<< "Copy constructor allocating ptr." <<endl; ptr = new int; // copy the value //这里右式的运算顺序是先获取obj.ptr,再用'*'取值. //因为是复制值,而不是复制地址,所以'='两边都要加上'*', //否则,多个Line对象的长度都会被绑定到一起。 *ptr = *obj.ptr; }
- 析构函数(在对象被销毁时执行):
Line::~Line(void){ cout<< "Freeing memory!"<<endl; delete ptr; }
- 获取
Line
对象的长度,直接返回指针指向的int
类型数据
int Line::getLength(void){ return *ptr; }
- 定义一个
display
函数,用于输出Line
对象的长度:
void display(Line obj){ cout<< "Length of line : "<<obj.getLength() <<endl; }
正文
对于以下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;
的时候,局部变量line1
和line2
被销毁,故析构函数被调用。 - 并且需要注意的是,这两个输出的顺序是:
Freeing memory! --> 对应line2的销毁 Freeing memory! --> 对应line1的销毁
- 这是因为变量是存储在栈区中的,遵循FILO(First In, Last Out)的顺序。
这篇关于[c++]关于拷贝构造函数和析构函数执行次数的思考的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-01巧用 TiCDC Syncpoint 构建银行实时交易和准实时计算一体化架构
- 2024-05-01银行核心背后的落地工程体系丨Oracle - TiDB 数据迁移详解
- 2024-04-26高性能表格工具VTable总体构成-icode9专业技术文章分享
- 2024-04-16软路由代理问题, tg 无法代理问题-icode9专业技术文章分享
- 2024-04-16程序猿用什么锅-icode9专业技术文章分享
- 2024-04-16自建 NAS 的方案-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数, 加上remote_src: yes 配置-icode9专业技术文章分享
- 2024-04-14ansible 检测远程主机的8080端口,如果关闭,则echo 进程已关闭-icode9专业技术文章分享
- 2024-04-14result 成功怎么写-icode9专业技术文章分享