vtk智能指针

1.引用指针

#include <vtkSmartPointer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>
#include <vtkObject.h>
//如果很多对象有相同的值,在程序里没有必要将这个值存储多次,更好的方法是让所有对象共享这个值。引用计数就是这样的技巧
//引用对象是个简单的垃圾回收体系,只要其他对象引用某一个对象,这个对象就会增加一个引用计数,当最后引用对象的对象移除,引用对象就会自动析构
int main()
{
	//先读入了一个bmp图像 new创建新对象初始的引用计数值就等于1
	vtkSmartPointer<vtkBMPReader>reader = vtkSmartPointer<vtkBMPReader>::New();
	reader->SetFileName("../vtk-logo.bmp");
	reader->Update();

	std::cout << "Reference Count of reader->GetOutput(Before Assignment)="
		<< reader->GetOutput()->GetReferenceCount() << std::endl;

	//没有新new对象 只是引用了之前的 计数器+1
	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;
	system("pause");//要是写return 0窗口闪一下就没了==
}

2.智能指针

其实我们之前写的代码都是用智能指针的,心脏的那个用的就全是原始指针,可能也是不涉及引用的问题吧。但是万万不可混着用,啥叫混着用?左边有vtkSmartPointer<vtkImageData>image1右边vtkImageData::New()。

而且如果没有给对象分配内存,仍然可以使用智能指针。比如vtkSmartPointer<vtkImageData>image1 = 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();
同样,上面那行代码左侧不可以是原始指针。


需要注意一点:

当创建一个智能指针类型的对象,然后改变他的指向,这时候引用计数就会出错==




by the way 运行时的类型识别,应该还是很有用的==

IsA()函数~头文件#include<type_info>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值