vtk智能指针->对智能指针的理解和使用
来源:互联网 发布:墨仓式打印机 知乎 编辑:程序博客网 时间:2024/05/21 10:44
学习代码:
#include <vtkSmartPointer.h>#include <vtkBMPReader.h>#include <vtkImageData.h>#include <vtkObject.h>// MyFunction函数:演示智能指针可以作为函数返回值vtkSmartPointer<vtkImageData> MyFunction(){ vtkSmartPointer<vtkImageData> myObject = vtkSmartPointer<vtkImageData>::New(); std::cout<<"MyFunction::myObject reference count = "<<myObject->GetReferenceCount()<<std::endl; return myObject;}//测试文件:data/VTK-logo.bmpint main(int argc, char* argv[]){ //演示引用计数: vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New(); reader->SetFileName("C:\\Users\\Administrator\\Desktop\\vtk1\\Examples\\Examples\\Chap02\\data\\VTK-logo.bmp"); reader->Update(); std::cout<<"Reference Count of reader->GetOutput (Before Assignment) = " <<reader->GetOutput()->GetReferenceCount()<<std::endl; vtkSmartPointer<vtkImageData> image1 = reader->GetOutput(); std::cout<<"Reference Count of reader->GetOutput (Assign to image1) = " <<reader->GetOutput()->GetReferenceCount()<<std::endl; std::cout<<"Reference Count of image1 = " <<image1->GetReferenceCount()<<std::endl; vtkSmartPointer<vtkImageData> image2 = reader->GetOutput(); std::cout<<"Reference Count of reader->GetOutput (Assign to image2) = " <<reader->GetOutput()->GetReferenceCount()<<std::endl; std::cout<<"Reference Count of image2 = " <<image2->GetReferenceCount()<<std::endl; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //演示智能指针可以作为函数返回值 //由于函数MyFunction()的返回值是通过拷贝的方式, //将数据赋予调用的变量,因此该数据的引用计数保持不变 std::cout<<"myObject reference count = " <<MyFunction()->GetReferenceCount()<<std::endl; vtkSmartPointer<vtkImageData> MyImageData = MyFunction(); std::cout<<"MyFunction return value reference count = " <<MyFunction()->GetReferenceCount()<<std::endl; std::cout<<"MyImageData reference count = " <<MyImageData->GetReferenceCount()<<std::endl; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //如果没有给对象分配内存,仍然可以使用智能指针: vtkSmartPointer<vtkBMPReader> Reader = vtkSmartPointer<vtkBMPReader>::New(); vtkImageData* pd = Reader->GetOutput(); ////////////////////////////////////////////////////////////////////////// system("pause"); return EXIT_SUCCESS;}
引用计数概念:
引用计数是一个简单 的垃圾回收机制。
只要其他对象引用某对象,这个对象的引用计数就会增加1,当最后所有引用该对象的对象都移除之后,这个对象自动析构。
在vtk当中这样的好处是可以实现数据的共享而不用复制,可以节省内存。
image1->GetReferenceCount();//该方法可以获得当前对象的引用计数
一旦某个对象的引用计数等于0,就表明没有别的对象再引用他了,他的使命也就结束了,程序会自动析构这个对象。
智能指针:
智能指针可以自动管理引用计数的增加和减少,若检测到某对象的引用计数减少为0,则会自动释放给对象的资源。
这又要回到vtk中创建对象的方式上了:
vtk有两种创建对象的方式:
- 使用vtkObjectBase里的静态成员函数New(),再用Delete()方法析构。
- 使用智能指针的方式vtkSmartPointer < T >的方式。
对于第一种方式创建的对象是程序员再堆上创建的对象,这个对象并不会自动析构,不关编译器的事情(编译器只管栈上的事情),所以在程序的最后必须调用Delete()方法,使得引用计数减一。
vtkBMPReader* reader = vtkBMPReader::New();....reader->Delete();//这里并没有直接析构这个对象,而是使引用计数减一。
对于第二种方式,不用手动调用Delete()方法,因为引用计数的减少和增加都是智能指针自动完成的。
使用智能指针就需要包含智能指针的头文件vtkSmartPointer.h。vtkSmartPointer是一个模板类所需要的参数就是待创建的对象的类名。
必须写成一下形式:
vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();
不能写成:
vtkSmartPointer<vtkBMPReader> reader = vtkBMPReader::New();
这样编译没问题,但是程序退出的时候智能指针无法自动释放该对象的内存。出现内存泄漏。
所以不能把对象的原始指针赋值给智能指针。
关于智能指针的介绍可以看下面这篇文章:https://www.cnblogs.com/TenosDoIt/p/3456704.html
阅读全文
0 0
- vtk智能指针->对智能指针的理解和使用
- vtk智能指针
- VTK学习-智能指针
- 智能指针的理解
- 智能指针的理解
- 智能指针的理解
- 对智能指针的一些理解
- 理解和使用C++中的智能指针
- 智能指针的理解 和 简单实现
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- 智能指针的使用
- VTK之智能指针详解
- VTK基本概念之VTK智能指针
- 自己理解的智能指针
- 对智能指针的学习
- c++智能指针的设计和使用
- Django Models CharField 参数说明
- 最新 IntelliJ Idea 2017 激活方法
- Python中 sys.argv[]的用法简明解释
- 答案差不多就行? About 近似
- Spring-messaging (STOMP) @SendTo 与 @SendToUser的区别
- vtk智能指针->对智能指针的理解和使用
- 你是如何转行的?转行容易吗?
- Mac入手使用记录
- 怎么从数组a中减去数组b,得到数组C
- 普宁跨境电商外贸 之 到底要不要寄样品? 怎么寄样品?
- okhttp的依赖
- 线程池 信号量
- leetcode--14. Longest Common Prefix
- 动态链接库之 隐式调用——vs手把手演示