1. 程式人生 > >vtk智慧指標->對智慧指標的理解和使用

vtk智慧指標->對智慧指標的理解和使用

學習程式碼:

#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.bmp int 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有兩種建立物件的方式:

  1. 使用vtkObjectBase裡的靜態成員函式New(),再用Delete()方法析構。
  2. 使用智慧指標的方式vtkSmartPointer < T >的方式。

對於第一種方式建立的物件是程式設計師再堆上建立的物件,這個物件並不會自動析構,不關編譯器的事情(編譯器只管棧上的事情),所以在程式的最後必須呼叫Delete()方法,使得引用計數減一。

vtkBMPReader* reader = vtkBMPReader::New();
....
reader->Delete();//這裡並沒有直接析構這個物件,而是使引用計數減一。

對於第二種方式,不用手動呼叫Delete()方法,因為引用計數的減少和增加都是智慧指標自動完成的。
使用智慧指標就需要包含智慧指標的標頭檔案vtkSmartPointer.h。vtkSmartPointer是一個模板類所需要的引數就是待建立的物件的類名。
必須寫成一下形式:

vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();

不能寫成:

vtkSmartPointer<vtkBMPReader> reader = vtkBMPReader::New();

這樣編譯沒問題,但是程式退出的時候智慧指標無法自動釋放該物件的記憶體。出現記憶體洩漏。
所以不能把物件的原始指標賦值給智慧指標。

相關推薦

vtk智慧指標->智慧指標理解使用

學習程式碼: #include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageData.h> #include <vtkObject

每天一個JS 小demo之韓雪冬輪播圖。主要知識點:html,css布局,對於數組象的理解運用

身高 全局 borde ava ebo 空間 use mouseout desc 1 @charset "utf-8"; 2 /* CSS Document */ 3 4 * { padding: 0; margin: 0; } 5 li { list-st

Servlet的理解認識

Servlet是在伺服器端的應用程式,本身不能單獨執行,需要配合web應用來完成它的功能和使用,目前我們主要使用servlet完成前後端互動以及訪問資料庫,使用servlet與html結合就能夠搭建出一個完整的web應用專案。可見它的功能還是很強大的。但是servlet儘管很強大,用它去搭建web專

初識Kubernetes(K8s):各種資源象的理解定義

ash 峰值 假設 sleep mysql linux環境變量 模板 針對 客戶端訪問 一、Pod Kubernetes為每個Pod都分配了唯一的IP地址,稱之為Pod IP,一個Pod裏的多個容器共享Pod IP地址。Kubernetes要求底層網絡支持集群內任意兩個Po

程序的理解POSIX 訊號量的使用

這兩天看了一個不錯的作業系統mooc,對Linux程序有了一個基本的認識,感覺一些網上的資料只是照搬概念。 1 對程序的理解 為什麼要有作業系統? 作業系統本質上就是一個程式,是為了我們更方便的

opencl簡單理解緩衝區以及相關操作的簡單理解(完結)

一.總體概括 計算機涉及的計算量越來越大,cpu明顯已經不能再滿足如此強大的計算需求.於是,另一些硬體出現了-GPU,DSP等.該怎麼讓這些硬體參與到日常的計算中來,這是個問題,為了解決這個問題,就有了OpenCL. (百度百科有云:OpenCL是一個

關於cpu的理解kvm虛擬機器到物理cpu的繫結

邏輯CPU個數是指cat /proc/cpuinfo 所顯示的processor的個數 # cat /proc/cpuinfo | grep "processor" | wc -l物理CPU個數: 物理CPU個數,是指physical id(的值)的數量 # cat /proc/cpuinfo | grep

線程池:ThreadPoolExecutor的理解源碼探索

cep star 等待 啟動 running 占用 效率 tee 創建線程 對線程池的理解 在沒有引入線程池之前,如果去創建多線程,就會出現這幾種情況:第一,創建現場本身就占用CPU資源,給CPU帶來壓力;第二,線程本身也要占用內存空間,大量的線程會占用內存資源並且可能會

C++之智慧指標std::shared_ptr簡單使用理解

1  智慧指標std::shared_ptr相關知識和如何使用 我們這裡先說下智慧指標std::shared_ptr,因為我看到我我們專案c++程式碼裡面用得很多,我不是不會,所以記錄學習下 先讓ubuntu終端支援c++11,如果自己的電腦還沒配置號,可以先看下我的這篇部落格

物件指標、this指標智慧指標

物件指標 指向的是一個物件,定義形式為: *類名 物件指標名; 那如何通過指標訪問物件成員呢? 物件指標名->成員名 例:使用指標來訪問Point類的成員 #include using namespace std; class Point { public: Point(in

this 指標理解作用

this指標只能在一個類的成員函式中呼叫,它表示的是當前物件的地址。 1. this只能在成員函式中使用。全域性函式,靜態函式都不能使用this。實際上,成員函式預設第一個引數為T* const register this。如: class A { public:     

Android系統的智慧指標(輕量級指標、強指標指標)的實現原理分析

        Android系統的執行時庫層程式碼是用C++來編寫的,用C++來寫程式碼最容易出錯的地方就是指標了,一旦使用不當,輕則造成記憶體洩漏,重則造成系統崩潰。不過系統為我們提供了智慧指標,避免出現上述問題,本文將系統地分析Android系統智慧指標(輕量級指標、強

徹底搞清c/c++中的幾個指標概念:懸垂指標智慧指標以及啞指標指標

先看看下面兩段程式碼執行結果: #include<iostream> //#include <windows.h> using namespace std; int *p=NULL; void fun() {int i=10;p=&i;} v

android智慧指標之強指標指標

LightRefBase是輕量級的,那麼RefBase就應該是重量級的了,它的名字中少了light。Android為神馬要引入這個類呢?想一下這樣一個場景,現在有兩個物件:A和B,物件A中有B的引用,因此B的引用等於1;物件B中有A的引用,因此物件A的引用對於1;現在問題來了,這兩個物件和外界的任何物件都沒有

通達信 唐能通 短線是銀選股指標 盤中預警指標公式指南針大智慧

郵箱 預警 roc type color nag blog http cee 本指標適合通達信使用!指標不是萬能的,但沒有指標是萬萬不行的,指標不在於多少,而在於精準,我們的指標都是基於實戰,經過實戰的無數次檢驗,一旦擁有就別無所求了。擁有一個精準的好指標,就意味著您身邊多

C語言指標——普通變數的指標操作陣列(常量)的指標操作

       我們知道,每一個變數都有一個記憶體位置,每一個記憶體位置都定義了可使用連字號(&)運算子訪問的地址,它表示了在記憶體中的一個地址。        我們喜歡在程式中使用指標代替陣列,因為變數指標可

指標辨析:懸垂指標、啞指標、野指標智慧指標

原文地址:https://blog.csdn.net/zhaojinjia/article/details/8770989 懸垂指標:   1:提出的原因: 請看下面的程式碼片段:     int *p=NULL;

一級指標,二級指標指標陣列,指標陣列的理解及相關應用

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> 一級指標 int main() { //字元型指標的一般使用 /*char p = ‘w’; char pc = &p; pc = ‘w’

C++中this指標理解用法

關於this指標的一個精典回答: 當你進入一個房子後,你可以看見桌子、椅子、地板等,但是房子你是看不到全貌了。對於一個類的例項來說,你可以看到它的成員函式、成員變數,但是例項本身呢?this是一個指標,它時時刻刻指向你這個例項本身。 個人理解: (ps:class類就好比這

智慧合約】客戶端web端智慧合約的事件Event進行呼叫的程式碼示例

客戶端和web端對智慧合約的事件Event進行呼叫的程式碼示例 web truffle 按官網的例子 truffle作為一個執行測試框架,用的也是web3對智慧合約進行呼叫。 檔案所在的位置src/js/app.js initWeb3: