2010-05-17 83 views
2

我想使用智能指針,如auto_ptr,shared_ptr。但是,我不知道如何在這種情況下使用它。針對非對象類型的C++智能指針?

CvMemStorage *storage = cvCreateMemStorage(); 
... use the pointer ... 
cvReleaseMemStorage(&storage); 

我不確定,但我認爲存儲變量只是一個malloc'ed內存,而不是C++類對象。有沒有辦法將智能指針用於存儲變量?

謝謝。

+1

我們沒有辦法告訴你如何在沒有看到「cvCreateMemStorage」來源的情況下分配內存。它可能是'malloc',它可能是'new'ed,它可能不是什麼東西,也許函數'cvCreateMemStorage'總是返回'NULL'。 – 2010-05-17 07:42:45

+1

您確定'cvReleaseMemStorage'採用'CvMemStorage **'而不是'CvMemStorage *'?這似乎很奇怪。 – ereOn 2010-05-17 07:49:35

+0

的確有點奇怪,但[它](http://opencv.willowgarage.com/documentation/dynamic_structures.html#releasememstorage)。 – 2010-05-17 07:55:45

回答

9

shared_ptr允許您指定自定義釋放器。然而,看着文檔cvReleaseMemStorage()沒有合適的形式(void f(T*)),你需要的包裝:

void myCvReleaseMemStorage(CvMemStorage* p) { 
    cvReleaseMemStorage(&p); 
} 

shared_ptr<CvMemStorage> sp(cvCreateMemStorage(), &myCvReleaseMemStorage); 
+0

另請注意,'shared_ptr'這個特性往往被低估。爲了使'auto_ptr'工作,用戶需要知道如何釋放它,但是使用'auto_ptr'指定在施工時如何釋放,然後它隱藏起來,用戶從不需要擔心。當然,默認值是一個經典的「刪除」調用。 – 2010-05-17 12:58:56

1

shared_ptr類可以爲您提供自定義刪除功能/仿函數,你可以簡單地包裹cvReleaseMemStorage函數在函數中,並提供shared_ptr連同你想讓它管理的指針?