2012-04-23 45 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以外的其他方面。

相关问题