是否有可能适应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