用malloc和free shared_ptr的(shared_ptr with malloc an

2019-07-31 08:19发布

我在那些含C和CPP大型应用程序的工作。 将所有文件保存为CPP扩展,但代码是用C-风格。 我的意思是它通过的malloc和realloc和calloc.In最近他们已经安装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));

Answer 1:

我可以使用的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



Answer 2:

要使用std::shared_pointermalloc()free() ,应指定一个定制删除。 这应该这样做

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

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

编辑:增加了铸造的结果malloc()T*



Answer 3:

我可以使用的shared_ptr用malloc和free。 如果是任何人都可以指出我品尝的代码库。

是。 shared_ptr不分配内存本身。 然而,它确实删除对象一旦引用计数下降到零。 由于它使用delete默认情况下,你不能与分配对象使用malloc (或任何其他方式),你必须使用一个定制删除 。

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

目前还不清楚是什么你问这里。 如果函数不预期共享指针被传递,然后格外小心,必须采取。 但是这取决于什么函数实际上做。

我们必须调用一些功能,接受双指针,并填写他们的应用程序内部的结构和使用malloc我们能否分配这些指针shared_ptr的。

是的,你可以使用任何在终场前shared_ptr



文章来源: shared_ptr with malloc and free