是否可以将unique_ptr用于普通c?
也许如果有一种方法可以在调用malloc / free时模拟对自制“构造函数/析构函数”的调用?
可行吗?或者这只是一个愚蠢的想法?
答案 0 :(得分:6)
“智能指针”的重点是在销毁时自动执行某些任务。由于C没有析构函数,除了使用显式函数调用之外没有办法实现这一点 - 但这就是你已经在C中释放内存的方式。
你可以创建一个需要释放的指针列表,并通过一个函数调用同时完成所有这些指针。
答案 1 :(得分:2)
在第二次阅读时,没有什么能阻止你的C结构以void(*)()
指针开始。如果您有custom_malloc(size_t size, void(*deleter)()
设置指针,则custom_free(void*)
可以随后调用该删除器。这类似于C ++中的virtual
析构函数。但是,std::unique_ptr
的第二部分是delete
'd复制构造函数。你不能用C语言做到这一点。
答案 2 :(得分: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之外的其他方面。
答案 3 :(得分:0)
为了实现unique_ptr,您需要两件事:
为了实现(1),由于C不允许你进行函数重载,你需要自己“训练”并始终调用自定义赋值函数或宏。 C不能强迫你总是转让所有权。
对于(2),GCC提供extension:你可以分配一个“清理”函数,一旦变量超出范围就会调用它。这可以用于为unique_ptr实现析构函数。