是否有可能使unique_ptr适用于普通c?

时间:2012-04-23 14:18:05

标签: c++ c unique-ptr

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

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

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

4 个答案:

答案 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. 转让所有权的转让运营商;
  2. 当unique_ptr超出范围时的析构函数。
  3. 为了实现(1),由于C不允许你进行函数重载,你需要自己“训练”并始终调用自定义赋值函数或宏。 C不能强迫你总是转让所有权。

    对于(2),GCC提供extension:你可以分配一个“清理”函数,一旦变量超出范围就会调用它。这可以用于为unique_ptr实现析构函数。