是否可以将C++智能指针与C的malloc一起使用?

bod*_*ydo 23 c++ malloc smart-pointers new-operator

我的一些代码仍然使用malloc而不是new.原因是因为我害怕使用,new因为它抛出异常,而不是返回NULL,我可以很容易地检查.结束语每次调用newtry{}catch(){}也看起来并不好.而在使用时malloc我可以做到if (!new_mem) { /* handle error */ }.

所以我有一个问题.我可以同时使用智能指针malloc吗?

就像是:

SmartPointer<Type> smarty = malloc(sizeof(Type));
Run Code Online (Sandbox Code Playgroud)

像这样的东西.

这可能吗?

谢谢,Boda Cydo.

Jam*_*lis 39

如果您正在使用shared_ptrunique_ptr,则可以指定自定义删除器.例如,

struct free_delete
{
    void operator()(void* x) { free(x); }
};
Run Code Online (Sandbox Code Playgroud)

这可以shared_ptr像这样使用:

std::shared_ptr<int> sp((int*)malloc(sizeof(int)), free_delete());
Run Code Online (Sandbox Code Playgroud)

如果您正在使用unique_ptr,则删除器是该unique_ptr类型的一部分,因此需要将删除器指定为模板参数:

std::unique_ptr<int, free_delete> up((int*)malloc(sizeof(int)));
Run Code Online (Sandbox Code Playgroud)

但是,在编写C++时,最好正确使用异常,而不是避免使用异常,尤其是在分配失败方面.在大多数情况下,您无法从尝试执行分配的函数中的分配失败中成功恢复,因此异常可以帮助您处理实际能够处理它的错误.

  • 你也可以直接传递`free`:`auto myPointer = std :: unique_ptr <int,void(*)(void*)>(...,free)` (4认同)
  • @PatrickChilton请注意,如果你这样做,你的`unique_ptr`将是你的两倍. (2认同)

gti*_*kok 9

您可以对new运算符使用nothrow关键字,它将返回NULL而不是抛出异常.有关详细信息,请参阅以下链接:http: //www.cplusplus.com/reference/std/new/nothrow/

  • 当你不希望它抛出异常时,这是使用`new`的最常用方法.但不是,更常见的是使用`new`和work*with*exception handling.如果分配失败,你通常无论如何都不能做很多事情,所以让异常传播是一种非常干净的方式来优雅地退出. (8认同)
  • 使用“nothrow”是一种常见做法吗?(因为我自己在实际实践中还没有亲眼见过 nothrow 的使用。) (2认同)