vtk智慧指標

MissZhou要努力發表於2016-04-30

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>

相關文章