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>