1

是否可以将 unique_ptr 用于普通 c?

也许在调用 malloc/free 时有一种方法可以模拟对自制“构造函数/析构函数”的调用?

可行吗?或者这只是一个愚蠢的想法?

4

4 回答 4

6

“智能指针”的全部意义在于在销毁时自动执行某些任务。由于 C 没有析构函数,因此除了显式调用函数外,没有其他方法可以实现这一点——但这就是您在 C 中释放内存的方式。

您可以创建一个需要释放的指针列表,并通过一个函数调用同时完成所有这些操作。

于 2012-04-23T14:21:06.567 回答
3

不,不是纯 C。您可以使用cleanupGCC 属性执行类似的操作(它不是标准的):

#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 之外的其他方面。

于 2012-04-23T14:35:28.233 回答
2

在第二次阅读中,没有什么可以阻止您的 C 结构以void(*)()指针开头。如果你有一个custom_malloc(size_t size, void(*deleter)()设置指针的,你custom_free(void*)可以随后调用那个删除器。这类似于virtualC++ 的析构函数。但是,第二部分std::unique_ptr是一个delete'd 复制构造函数。你不能在 C 中做到这一点。

于 2012-04-23T14:25:53.673 回答
0

为了实现 unique_ptr,您需要两件事:

  1. 转让所有权的转让运营商;
  2. 当 unique_ptr 超出范围时的析构函数。

为了实现 (1),由于 C 不允许您进行函数重载,因此您需要自己“纪律”并始终调用自定义赋值函数或宏。C 不能强迫您始终转移所有权。

至于(2),GCC 提供了一个扩展:您可以分配一个“清理”函数,一旦变量超出范围,就会调用该函数。这可用于为您的 unique_ptr 实现析构函数。

于 2012-04-23T14:26:09.147 回答