随笔 - 1762  文章 - 0  评论 - 109  阅读 - 431万

shellmad-15_C++新特性 引用计数

要正确理解智能指针,首先必须理解引用计数技术。

深拷贝、浅拷贝的概念

深拷贝的优缺点:

优点:每一个对象(哪怕是通过拷贝构造函数实例化的对象)的指针都有指向的内存空间而不是共享,所以在对象析构的时候就不存在重复释放或内存泄漏的问题了。

缺点:内存开销大

  1. 注解:假如是a="hello,"; b="world!"; 现在要执行拷贝行为:b=a; 如果是深拷贝(不用默认的拷贝构造,而是自己写的拷贝构造),则首先为b动态分配和a所占用内存空间一样大小的内存空间,然后执行字符串复制, 把a的内容复制给b,这样a和b就会指向各自的内存空间。

浅拷贝优缺点:

优点:通过拷贝构造函数实例化的对象的指针数据变量指向共享的内存空间,因此内存开销较小。

缺点:对象析构的时候可能会重复释放或者造成内存泄漏。

  1. 注解:假如是a="hello,"; b="world!"; 现在要执行拷贝行为:b=a; 如果是浅拷贝(用默认的拷贝构造,而不是自己写的拷贝构造),则b会指向a指向的内存空间,这样a和b就会指向相同的内存空间,从而在拷贝的时候会造成内存泄漏,因为b此时改变了指向,那它原来指向的内存空间("world!")就变成了"孤儿"。

 思考:能不能把深拷贝和浅拷贝的有点结合起来呢?结合它们的优点,避开它们各自的缺点。

举例说明:

在深拷贝的情况下,通过拷贝构造或者拷贝赋值构造的对象均各自包含自己的指针指向"hello"。

 

 显然,这样比较浪费内存,存在冗余,那么下面的版本更好:

 

 注解:

  1. 它们使用同一块内存(资源)。
  2. 但是,此时对其中任一个变量的操作都会影响其它变量指向的内容。
  3. 释放任何一个变量的内存,其他的变量也同时被释放,这个叫重复释放问题。

 

posted on   一杯明月  阅读(291)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示