【发布时间】:2012-08-29 04:26:23
【问题描述】:
我在包含 c 和 cpp 的大型应用程序中工作。所有文件都保存为 cpp 扩展名,但代码是用 c-style 编写的。我的意思是它是通过 malloc 和 realloc 和 calloc 定义结构而不是类分配内存。最近他们已经安装了 boost 库所以我打算在我现有的代码库中使用所以我有一些以下问题。
- 我可以将 std::shared_ptr 与 malloc 和 free 一起使用吗?
- 如果是,谁能指出我的示例代码库?
- 如果我在我的应用程序中创建 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));
【问题讨论】:
-
是的,
shared_ptr<T> sp((T*)::malloc(...), ::free),取决于他们如何使用指针,是的 (T* p; fill_p(&p); shared_ptr<T> sp(p, ::free);)。不过,我建议使用允许删除器的手写scoped_ptr(类似于std::unique_ptr允许删除器作为模板参数的方式)。 -
对不起,我不太清楚你的例子。你的意思是当我分配内存时,我们将调用免费。对于Exp
-
shared_ptr的第二个参数是删除器,也就是应该释放指针时调用的东西。
标签: c++ boost shared-ptr scoped-ptr