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有兩種建立物件的方式:
- 使用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();
這樣編譯沒問題,但是程式退出的時候智慧指標無法自動釋放該物件的記憶體。出現記憶體洩漏。
所以不能把物件的原始指標賦值給智慧指標。
相關推薦
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: