2012-04-23 13 views
1

是否有可能適應plain_ptr for plain c?它可以適應unique_ptr在純C中使用嗎?

也許如果有一種方法來模擬調用malloc/free時調用自制的「構造函數/析構函數」?

它可行嗎?或者這只是一個愚蠢的想法?

+0

恩,馬克和我似乎有兩種截然不同的解釋。你是否試圖在unique_ptr中打包C代碼,還是試圖從C中使用unique_ptr? – MSalters 2012-04-23 14:22:33

+0

@MSalters我想看看是否有可能使用unique_ptr從內部C. – mantler 2012-04-23 14:23:50

+0

如果你想要這種行爲,爲什麼你在C編程?你會得到相同的膨脹,就好像你使用了更高級別的語言,沒有任何細節...... – 2012-04-23 14:40:34

回答

6

「智能指針」的重點是在銷燬時自動執行某些任務。由於C沒有析構函數,除了明確的函數調用之外,沒有辦法完成這個任務 - 但是這就是你如何在C中釋放內存的方式。

您可能會創建一個需要釋放的指針列表,並且可以在一次函數調用的同時完成所有這些指針。

2

二讀時,沒有什麼能夠阻止您的C結構以void(*)()指針開始。如果您有設置指針的custom_malloc(size_t size, void(*deleter)(),則您的custom_free(void*)可以隨後調用該刪除器。這類似於C++的一個virtual析構函數。然而,std::unique_ptr的第二部分是一個delete的拷貝構造函數。你可以這樣做,在C.

0

爲了實施的unique_ptr,你需要兩樣東西:

  1. 賦值運算符,其所有權轉移;
  2. 當unique_ptr超出範圍時的析構函數。

爲了實現(1),因爲C不允許你有函數重載,所以你需要自己「自律」,並且總是調用一個自定義的分配函數或宏。 C不能強迫你永遠擁有所有權。對於(2),GCC提供了一個extension:允許您分配一個「清理」功能,一旦變量超出範圍,就會調用該功能。這可以用來爲你的unique_ptr實現一個析構函數。

+0

實際上,'unique_ptr'確實不*具有轉讓所有權的賦值運算符(僅來自右值引用) - 否則它本質上是不安全的,就像過時的'auto_ptr'一樣。 – 2012-04-23 14:28:30

+0

@KonradRudolph:你說得對,我正在簡化。 – user1202136 2012-04-23 14:29:27

2

不,不是純C.你可以做的cleanup GCC屬性類似的東西(它不是標準):

#include <stdio.h> 

void scope_leaving(int* p) 
{ 
    printf("Leaving scope.\n"); 
    // this is essentially your "destructor" 
} 

int main(int argc, char* argv[]) 
{ 
    printf("Before x is declared.\n"); 
    { 
     int x __attribute__((cleanup (scope_leaving))); 
     x = 42; 
    } 
    printf("Scope was left.\n"); 
} 

正如你所期望的輸出是這樣的:

 
Before x is declared. 
Leaving scope. 
Scope was left. 

有了這個,你可以實現一個指針模擬unique_ptr的RAII語義,也許使用宏來更容易的聲明。還有更多unique_ptr,但我不確定你的問題是否需要除RAII以外的其他方面。

相關問題