2013-05-11 317 views
1

是否有可能在調用析構函數之前釋放vtkSmartPointer(對象生命週期結束範圍的結束)?如何釋放vtkSmartPointer

我有一個類繪製某種類型的情節。還有一個close()函數,它將關閉當前打開的窗口。但是如果用戶調用它,我想釋放所有剩餘的vtkSmartPointers,這個類必須釋放一些內存。假設他繪製了一些東西,進行了大量計算,然後喜歡用同一個對象再次繪製它。在這些計算過程中,我想釋放所有未使用的內存。

認爲是the documentation沒有像std::unique_ptr::release這樣的功能,但有沒有解決方法?

+4

如何只分配一個NULL指針呢? – Bwmat 2013-05-11 15:41:35

+0

請參閱此鏈接http://www.vtk.org/pipermail/vtkusers/2010-November/113500.html大衛戈比說:「當你重新分配一個智能指針,它的以前的內容自動釋放 。」所以Bwmat是正確的,如果我們分配NULL以前的數據將被刪除 – 2013-07-16 06:34:39

+0

新的正確鏈接:[link](http://vtk.1045678.n5.nabble.com/Recreating-a-smart-pointer-object-after-deletion- td3277130.html#a3277183) – Flot2011 2017-10-22 21:46:04

回答

3

Bwmat的回答作品:

#include <iostream> 
#include <vtkObject.h> 
#include <vtkObjectFactory.h> 
#include <vtkSmartPointer.h> 
class vtkMyClass : public vtkObject { 
public: 
    vtkTypeMacro(vtkMyClass,vtkObject); 
    void PrintSelf(ostream& os, vtkIndent indent){} 
    static vtkMyClass * New(); 
protected: 
    vtkMyClass(); 
    ~vtkMyClass(); 
}; 
vtkStandardNewMacro(vtkMyClass) 
vtkMyClass::vtkMyClass() { 
    std::cerr << "constructor called\n"; 
} 
vtkMyClass::~vtkMyClass() { 
    std::cerr << "destructor called\n"; 
} 
int main(int argc, char ** argv) { 
    std::cerr << __LINE__ << '\n'; 
    vtkSmartPointer<vtkMyClass> myObject; 
    std::cerr << __LINE__ << '\n'; 
    myObject = vtkSmartPointer<vtkMyClass>::New(); 
    std::cerr << __LINE__ << '\n'; 
    myObject = NULL; // calls destructor 
    std::cerr << __LINE__ << '\n'; 
    return 0; 
} 

輸出:

22 
24 
constructor called 
26 
destructor called 
28