【vtk学习笔记3】智能指针

news/2024/7/24 9:32:57 标签: 图形渲染, c++

一、引用计数算法

引用计数是一种垃圾收集技术,用于管理计算机内存中的无用对象。当一个对象不再被引用时,这个对象就可以被系统安全地删除,以便回收其占用的内存空间。

引用计数的核心思想是跟踪每个对象的引用数。当一个对象被引用时,其引用数会增加;当一个引用不再引用该对象时,其引用数就会减少。当一个对象的引用数减少到0时,就意味着该对象不再被使用,可以被垃圾收集器回收。

引用计数具有简单、高效的优点,但也有一些局限性。例如,它无法处理循环引用的问题。如果两个对象互相引用,即使它们都不再被其他对象引用,它们的引用数也不会减少到0。
C++11开始使用智能指针管理资源,会自动管理引用计数的增加与减少。

二、VTK智能指针

VTK中创建一个对象可以用三种方法:

  1. 使用vtkObjectBase中的静态成员变量New(),使用Delete()方法析构;
  2. 使用智能指针vtkSmartPointer,无需手动调用Delete()方法减少引用计数
  3. 使用RAII模式的vtkNew;
    在VTK中,对象都是被创建在堆上,必须Delete释放,否则会出现内存泄漏的情况。是由于VTK将vtkObjectBase类及其子类的构造函数都声明为受保护类型,不支持自行构造创建,这样就不能自动在函数栈上创建;使用智能指针创建对象,则无需手动调用Delete()方法减少引用计数,因为引用计数的增加与减少都是由智能指针自动完成的。VTK实现了便利的自动内存管理的概念,使用引用计数。与其他智能指针不同之处在于引用计数保留在VTK对象本身中,而不是智能指针类中。这样的好处在于:即使VTK对象作为原始指针传递,也可以增加引用计数。
2.1 vtkSmartPointer

VTK中的智能指针类为vtkSmartPointer,继承自vtkSmartPointerBase,可以看到是一个类模板。
使用时,如:

vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();
vtkImageData* imageData = reader->GetOutput();

智能指针类型也可作为函数的返回值,如:

vtkSmartPointer<vtkImageData> MyFunction()
{
	vtkSmartPointer<vtkImageData> myObject = vtkSmartPointer<vtkImageData>::New();
	std::cout<<"MyFunction::myObject reference count = "<<myObject->GetReferenceCount()<<std::endl;
	return myObject;
}

// 调用时
vtkSmartPointer<vtkImageData> MyImageData = MyFunction();

函数MyFunction()的返回值是通过复制的方式,将数据赋予调用的变量,因此改数据的引用计数保持不变,而且函数里的myObject不会被删除。

2.2 vtkNew

vtkNew是一个类模板,它在构造时使用T::New()分配并初始化其模板参数的实例。它假定在其生存期内拥有一个引用,并在销毁时调用T->Delete();可以看做是一个RAII的auto_ptr;

vtkNew被用于vtkSmartPointer的替代品,在简单环境中,可以使用vtkNew取代vtkSmartPointer; 功能和vtkSmartPointer一样,都是智能指针,不过更加轻量,推荐在局部变量使用,全局还是建议用vtkSmartPointer。
  注意:vtkNew的赋值构造函数和拷贝构造函数都被禁用;


http://www.niftyadmin.cn/n/5139457.html

相关文章

ctfhub技能树web题目全解

Rce 文件包含 靶场环境 重点是这个代码&#xff0c;strpos&#xff0c;格式是这样的strpoc&#xff08;1&#xff0c;2&#xff0c;3&#xff09; 1是要搜索的字符串&#xff0c;必须有&#xff1b;2是要查询的字符串&#xff0c;必须有&#xff1b;3是在何处开始查询&#…

云计算助力史上首届“云上亚运”圆满成功!

201金&#xff0c;魔幻的BGM&#xff0c;以及崛起的中国科技&#xff0c;让杭州亚运会成功出圈。 很多网友表示太震撼了&#xff01;开幕式很漂亮&#xff0c;杭州为了奥运造新城真豪横&#xff0c;看完一整个文化自信住&#xff01; 赛场内外除了无数个令人感动的瞬间&#…

IDEA优雅自动生成类注释和快捷键生成方法注释

生成类注释 Preferences->Editor->File and Code Templates-> Includes ->File Header 注释模板&#xff1a; /*** Classname ${NAME}* Description ${description}* Date ${DATE} ${TIME}* Created by ZouLiPing*/生成方法和字段注释 查看IDEA自动配置java快捷…

QT通过url下载http地址下的文件(文件夹)

前言 之前只写过通过http协议通信&#xff0c;没有写过下载http地址中的文件或者文件夹&#xff0c;了解一下在QT下如何下载。 其实很简单&#xff0c;同使用协议通信相同的是&#xff0c;创建QNetworkAccessManager和QNetworkRequest&#xff0c;设置QNetworkRequest的url&a…

《商业模式的逻辑》-1-为什么要学习商业模式

学习商业模式&#xff0c;也许你的idea会因为有商业模式的加持而变为现实^_^ 视频参考&#xff1a;【商业模式的逻辑】1. 为什么要学习商业模式_哔哩哔哩_bilibili【商业模式的逻辑】1. 为什么要学习商业模式是【商业模式的逻辑】清华大学&#xff08;全11讲&#xff09;沈拓 …

xhadmin多应用SaaS框架怎么更新?

xhadmin是什么&#xff1f; xhadmin 是一套基于最新技术的研发的多应用 Saas 框架&#xff0c;支持在线升级和安装模块及模板&#xff0c;拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能&#xff0c;助力企业发展、国家富强&#xff0c;致力于…

离散数学实践-编程实现利用真值表法求主析取范式以及主合取范式

*本文为博主本人校内的离散数学专业课的实践作业。由于实验步骤已经比较详细&#xff0c;故不再对该实验额外提供详解&#xff0c;本文仅提供填写的实验报告内容与代码部分&#xff0c;以供有需要的同学学习、参考。 -------------------------------------- 编程语言&#xff…

msvcp140.dll丢失怎么修复?msvcp140.dll文件缺失的解决方法

msvcp140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio 2015的一部分。这个文件包含了C运行时库的一些函数和资源&#xff0c;许多应用程序和游戏都需要依赖这个文件来正常运行。当电脑中缺少msvcp140.dll文件或者该文件损坏…