Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of deallocator & allocator in shared_ptr

I am using few library functions that return a pointer created either using malloc or new. So, I have my own customer deallocator based on what type of allocation was used.

E.g

shared_ptr<int> ptr1(LibFunctA(), &MallocDeleter); //LibFunctA returns pointer created using malloc
shared_ptr<int> ptr2(LibFunctB(), &newDeleter);  //LibFunctB returns pointer created using new

Now, I understand this is a very naive use of deallocator above but what other scenarios is it heavily used for ?

Also, how can one use a customer allocator ? I tried to assign a custom allocator as below but now how do I actually get it called ? Where does this kind of feature help ?

shared_ptr<int> ptr3(nullptr_t, &CustomDeleter, &CustomAllocator);  //assume both functs are defined somewhere.
like image 854
Frank Q. Avatar asked Dec 27 '22 05:12

Frank Q.


1 Answers

I don't see anything "naive" about using deleters that way. It is the main purpose of the feature after all; to destroy pointer objects that aren't allocated using the standard C++ methods.

Allocators are for when you need control of how the shared_ptr's control block of memory is allocated and deleted. For example, you might have a pool of memory that you want these things to come from, or if you're in a memory-limited situation where allocation of memory via new is simply not acceptable. And since the type of the control block is up to shared_ptr, there's no other way to be able to control how it is allocated except with some kind of allocator.

like image 107
Nicol Bolas Avatar answered Jan 10 '23 09:01

Nicol Bolas