23

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

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

或者换句话说:

对于以下代码,如何使用 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));
4

3 回答 3

32

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

是的。

谁能指出我的示例代码库。

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

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

请记住,malloc并且free只处理原始内存,并且您负责正确创建和销毁您可能希望保留在该内存中的任何重要对象。

如果我在我的应用程序中创建 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.

于 2012-09-04T13:55:51.347 回答
4

要使用std::shared_pointerwith malloc()free()您应该指定自定义删除器。这应该这样做

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

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

编辑:添加了malloc()to的转换结果T*

于 2012-09-04T13:46:02.783 回答
1

我可以将 shared_ptr 与 malloc 和 free 一起使用吗?如果是,谁能指出我的示例代码库。

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

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

不清楚你在这里问什么。如果该函数不希望传递共享指针,则必须格外小心。但这取决于该功能的实际作用。

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

是的,您可以将任何指针与shared_ptr.

于 2012-09-04T13:44:37.307 回答