Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to use a C++ smart pointers together with C's malloc?

Some of my code still uses malloc instead of new. The reason is because I am afraid to use new because it throws exception, rather than returning NULL, which I can easily check for. Wrapping every call to new in a try{}catch(){} also doesn't look that good. Whereas when using malloc I can just do if (!new_mem) { /* handle error */ }.

Therefore I have a question. Can I use smart pointers together with malloc?

Something like:

SmartPointer<Type> smarty = malloc(sizeof(Type)); 

Something like this.

Is this possible?

Thanks, Boda Cydo.

like image 975
bodacydo Avatar asked Aug 13 '10 13:08

bodacydo


1 Answers

If you are using shared_ptr or unique_ptr, you can specify a custom deleter. For example,

struct free_delete {     void operator()(void* x) { free(x); } }; 

This can be used with shared_ptr like so:

std::shared_ptr<int> sp((int*)malloc(sizeof(int)), free_delete()); 

If you are using unique_ptr, the deleter is a part of the unique_ptr's type, so the deleter needs to be specified as a template argument:

std::unique_ptr<int, free_delete> up((int*)malloc(sizeof(int))); 

However, it is better to use exceptions correctly, rather than avoiding them, when writing C++, especially with respect to allocation failures. In most cases, you cannot successfully recover from an allocation failure in the function trying to do the allocation, so exceptions can help you to handle the error where you are actually capable of handling it.

like image 118
James McNellis Avatar answered Sep 19 '22 14:09

James McNellis