是否可以将 unique_ptr 用于普通 c?
也许在调用 malloc/free 时有一种方法可以模拟对自制“构造函数/析构函数”的调用?
可行吗?或者这只是一个愚蠢的想法?
是否可以将 unique_ptr 用于普通 c?
也许在调用 malloc/free 时有一种方法可以模拟对自制“构造函数/析构函数”的调用?
可行吗?或者这只是一个愚蠢的想法?
“智能指针”的全部意义在于在销毁时自动执行某些任务。由于 C 没有析构函数,因此除了显式调用函数外,没有其他方法可以实现这一点——但这就是您在 C 中释放内存的方式。
您可以创建一个需要释放的指针列表,并通过一个函数调用同时完成所有这些操作。
不,不是纯 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");
}
如您所料,输出是这样的:
在 x 被声明之前。 离开范围。 范围被留下。
有了这个,你可以实现一个模拟 RAII 语义的指针unique_ptr
,也许使用一个宏来更容易声明。不仅unique_ptr
如此,但我不确定您是否想要除 RAII 之外的其他方面。
在第二次阅读中,没有什么可以阻止您的 C 结构以void(*)()
指针开头。如果你有一个custom_malloc(size_t size, void(*deleter)()
设置指针的,你custom_free(void*)
可以随后调用那个删除器。这类似于virtual
C++ 的析构函数。但是,第二部分std::unique_ptr
是一个delete
'd 复制构造函数。你不能在 C 中做到这一点。
为了实现 unique_ptr,您需要两件事:
为了实现 (1),由于 C 不允许您进行函数重载,因此您需要自己“纪律”并始终调用自定义赋值函数或宏。C 不能强迫您始终转移所有权。
至于(2),GCC 提供了一个扩展:您可以分配一个“清理”函数,一旦变量超出范围,就会调用该函数。这可用于为您的 unique_ptr 实现析构函数。