shared_ptr与malloc和免费

时间:2012-09-04 13:36:54

标签: c++ boost shared-ptr scoped-ptr

我在大型应用程序中工作,其中包含c和cpp。所有文件都保存为cpp扩展名,但代码以c风格编写。我的意思是它是定义结构而不是类通过malloc和realloc和calloc分配内存。最近他们已经安装了boost库所以我打算用到我现有的代码库中所以我有一些以下的问题。

  1. 我可以将std :: shared_ptr与malloc和free一起使用。
  2. 如果是,有人能指出我的示例代码库吗?
  3. 如果我在我的应用程序中创建std :: shared_ptr并将此指针传递给另一个使用malloc或calloc的函数,它会影响任何功能吗?
  4. 或换句话说:

    如何使用std :: shared_ptr实现类似的功能,代码如下:

    void allocateBlocks(int **ptr, int *cnt)
    {
        *ptr = (int*)malloc(sizeof(int) * 10);
        *cnt = 10;
        /*do something*/ 
    }
    
    int main()
    {
        int *p = NULL;
        int count = 0;
        allocateBlocks(&p, &count);
        /*do something*/
    
        free(p);
    }
    

    我们调用一些函数,它们接受双指针并在其应用程序中填充结构并使用malloc。我们可以将这些指针分配给std :: shared_ptr吗?例如:

    typedef struct txn_s
    {
        int s;
        int d;
        int *e;
    } txn_t;
    
    typedef boost::shared_ptr<txn_t> tpointer;
    
    tpointer((txn_t*)::malloc(sizeof(txn_t),::free));
    

3 个答案:

答案 0 :(得分:29)

  

我可以将shared_ptr与malloc和free一起使用吗。

  

任何人都可以指出我的示例代码库。

您需要提供自定义删除工具,以便使用free而非默认delete释放内存。这可以是指向free函数本身的指针:

shared_ptr<void> memory(malloc(1024), free);

请记住,mallocfree仅处理原始内存,并且您负责正确创建和销毁您可能希望保留在该内存中的任何非平凡对象。

  

如果我在我的应用程序中创建shared_ptr并将此指针传递给另一个函数,如果他们使用malloc或calloc。它会影响任何功能。

我不太关注这个问题。您可以将此shared_ptr与“正常”共享指针互换使用,如果这就是您所要求的。 类型擦除确保指针的用户不受不同类型的删除器的影响。与任何共享指针一样,如果使用get()提取原始指针,则必须要小心;具体而言,不要做任何可能free的事情,因为你已经不可撤销地为共享指针分配了所有权。

  

我们调用了一些函数,它接受双指针并在其应用程序中填充结构并使用malloc我们可以将这些指针分配给shared_ptr。

我猜你的意思是:

double * make_stuff() {
   double * stuff = static_cast<double*>(malloc(whatever));
   put_stuff_in(stuff);
   return stuff;
}

shared_ptr<double> shared_stuff(make_stuff(), free);

更新:我没有发现短语“双指针”,我假设你指的是C风格使用指针来模拟引用来模拟返回值;你也可以这样做:

void make_stuff(double ** stuff);

double * stuff = 0;
make_stuff(&stuff);
shared_ptr<double> shared_stuff(stuff, free);
  

如何处理realloc和calloc

可以使用calloc的结果初始化共享指针,或使用free返回要释放的内存的任何其他内容。您无法使用realloc,因为shared_ptr已获得原始指针的所有权,并且在不调用free的情况下不会释放它。

答案 1 :(得分:4)

要将std::shared_pointermalloc()free()一起使用,您应指定自定义删除工具。这应该这样做

std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);

只要你没有传递std::shared_ptr<T>::get()的结果,你的指针就是安全的。

修改:已将malloc()的结果投放到T*

答案 2 :(得分:1)

  

我可以将shared_ptr与malloc和free一起使用。   如果是,任何人都可以指出我的示例代码库。

是。 shared_ptr本身不分配内存。但是,一旦引用计数降至零,它就会删除您的对象。由于默认使用delete而您无法将其用于malloc(或任何其他方式)分配的对象,因此您必须使用custom deleter

  

如果我在我的应用程序中创建shared_ptr并将此指针传递给另一个函数,如果他们使用malloc或calloc。它会影响任何功能。

目前尚不清楚你在这里问什么。如果该函数不期望传递共享指针,则必须格外小心。但这取决于该功能实际上做了什么。

  

我们调用了一些函数,它接受双指针并在其应用程序中填充结构并使用malloc我们可以将这些指针分配给shared_ptr。

是的,您可以使用shared_ptr的任何指针。