是否有可能適應plain_ptr for plain c?它可以適應unique_ptr在純C中使用嗎?
也許如果有一種方法來模擬調用malloc/free時調用自制的「構造函數/析構函數」?
它可行嗎?或者這只是一個愚蠢的想法?
是否有可能適應plain_ptr for plain c?它可以適應unique_ptr在純C中使用嗎?
也許如果有一種方法來模擬調用malloc/free時調用自制的「構造函數/析構函數」?
它可行嗎?或者這只是一個愚蠢的想法?
「智能指針」的重點是在銷燬時自動執行某些任務。由於C沒有析構函數,除了明確的函數調用之外,沒有辦法完成這個任務 - 但是這就是你如何在C中釋放內存的方式。
您可能會創建一個需要釋放的指針列表,並且可以在一次函數調用的同時完成所有這些指針。
二讀時,沒有什麼能夠阻止您的C結構以void(*)()
指針開始。如果您有設置指針的custom_malloc(size_t size, void(*deleter)()
,則您的custom_free(void*)
可以隨後調用該刪除器。這類似於C++的一個virtual
析構函數。然而,std::unique_ptr
的第二部分是一個delete
的拷貝構造函數。你可以這樣做,在C.
爲了實施的unique_ptr,你需要兩樣東西:
爲了實現(1),因爲C不允許你有函數重載,所以你需要自己「自律」,並且總是調用一個自定義的分配函數或宏。 C不能強迫你永遠擁有所有權。對於(2),GCC提供了一個extension:允許您分配一個「清理」功能,一旦變量超出範圍,就會調用該功能。這可以用來爲你的unique_ptr實現一個析構函數。
實際上,'unique_ptr'確實不*具有轉讓所有權的賦值運算符(僅來自右值引用) - 否則它本質上是不安全的,就像過時的'auto_ptr'一樣。 – 2012-04-23 14:28:30
@KonradRudolph:你說得對,我正在簡化。 – user1202136 2012-04-23 14:29:27
不,不是純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以外的其他方面。
恩,馬克和我似乎有兩種截然不同的解釋。你是否試圖在unique_ptr中打包C代碼,還是試圖從C中使用unique_ptr? – MSalters 2012-04-23 14:22:33
@MSalters我想看看是否有可能使用unique_ptr從內部C. – mantler 2012-04-23 14:23:50
如果你想要這種行爲,爲什麼你在C編程?你會得到相同的膨脹,就好像你使用了更高級別的語言,沒有任何細節...... – 2012-04-23 14:40:34