23 c++ boost shared-ptr scoped-ptr
我在大型应用程序中工作,包含c和cpp.所有文件都保存为cpp扩展名,但代码以c风格编写.我的意思是它是定义结构而不是类通过malloc和realloc和calloc分配内存.最近他们已经安装了boost库所以我打算使用我现有的代码库所以我有一些以下的问题.
或者换句话说:
对于以下代码,如何使用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);
}
Run Code Online (Sandbox Code Playgroud)
我们调用一些函数,它们接受双指针并在其应用程序中填充结构并使用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));
Run Code Online (Sandbox Code Playgroud)
Mik*_*our 31
我可以将shared_ptr与malloc和free一起使用.
是.
任何人都可以指出我的示例代码库.
您需要提供自定义删除器,以便使用free
而不是默认值释放内存delete
.这可以是指向free
函数本身的指针:
shared_ptr<void> memory(malloc(1024), free);
Run Code Online (Sandbox Code Playgroud)
请记住,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);
Run Code Online (Sandbox Code Playgroud)
更新:我没有发现短语"双指针",我假设你指的是C风格使用指针来模拟引用来模拟返回值; 你也能做到:
void make_stuff(double ** stuff);
double * stuff = 0;
make_stuff(&stuff);
shared_ptr<double> shared_stuff(stuff, free);
Run Code Online (Sandbox Code Playgroud)
如何处理realloc和calloc
可以使用结果calloc
或其他任何返回要释放的内存来初始化共享指针free
.你不能使用realloc
,因为shared_ptr
已取得原始指针的所有权,并且不会在没有调用的情况下释放它free
.
要使用std::shared_pointer
withmalloc()
和,free()
您应该指定一个自定义删除器。这应该可以做到
std::shared_ptr<T> ptr(static_cast<T*>(malloc(sizeof(T))), free);
Run Code Online (Sandbox Code Playgroud)
只要您不传递 的结果std::shared_ptr<T>::get()
,您的指针就是安全的。
编辑:malloc()
添加了将结果转换为的结果T*
。