C++ unique/shared ptr custom deleters

I’ve recently found the need for a custom deleter function attached to smart pointers in C++ and I found there are a number of different ways to implement this.

I’ll touch on the advantages/disadvantages of the different ways to use custom deleters and the difference between unique and shared ptr.

std::unique_ptr:

The type of the deleter is defined as part of the unique_ptr and you define it as the second template parameter, then when constructing the type, you must pass through the type specified as a parameter.

Instead of std::unique_ptr calling ‘delete’ and invoking the destructor on the internally stored pointer, it will instead pass the pointer to the function provided.

The deleter must by a type which implements a operator() which takes a T* as a parameter.

So in the example below, we specify that the deleter is std::function<void(MyClass*)>. Then on construction, we pass through the function we want to call.

class MyClass
{
public:
    ~MyClass() { }
};

using DefaultPtr = std::unique_ptr<MyClass>;
DefaultPtr pDefault; //Will call MyClass::~MyClass()

using CustomDeletePtr = std::unique_ptr<MyClass, std::function<void(MyClass*)>>;
CustomDeletePtr pCustom; //Will call function passed through on construction

static void CustomDeleter(MyClass* pMyClass)
{
    //This will be called instead of delete and invoking the constructor.
}

void InitPointers()
{
    pDefault = DefaultPtr(new MyClass());
    pCustom = CustomDeletePtr(new MyClass(), &CustomDeleter);
}

std::unique_ptr – cheapest implementations:

The custom deleter type you specify will affect the size of your std::unique_ptr. The sizes below are from C++ VS2019 64bit.

  • Default: std::unique_ptr<MyClass> (no custom deleter) – 8 bytes.
  • 1: std::unique_ptr<MyClass, CustomDeleteClass> – 8 bytes.
  • 2 std::unique_ptr<MyClass, decltype(lambda)> – 8 bytes.
  • 2: std::unique_ptr<MyClass, void(*)(MyClass*)> – 16 bytes.
  • 3: std::unique_ptr<MyClass, std::function<void(MyClass*)> – 72 bytes.

Lets talk about the sizes above. std::unique_ptr by default is a really simple wrapper for a pointer and it only has to store the 8 byte pointer.

Adding custom deleters can increase the size of std::unique_ptr because it has to store the type specified. std::function really bloats out the size of the std::unique_ptr because of the flexibility and features it provides.

Providing a C Style function as the deleter void(*)(MyClass*) increases the size to 16 bytes. This is because it needs to store a pointer to the function specified. Its increase the size of the function but offers good flexibility because you can provide any function you want when constructing.

Using a custom deleter class with an operator() or a lambda incurs no additional storage overhead because the custom deleter function is always the same for all objects created and the DeleterClass contains no member variables.

class DeleterClass
{
public:
    void operator()(MyClass* pMyClass)
    {
    }
};

using CustomDeleteOperatorPtr = std::unique_ptr<MyClass, DeleterClass>;
CustomDeleteOperatorPtr MyCustomPtr(new MyClass());

auto lambda = [](MyClass* p) { delete p; };
std::unique_ptr<MyClass, decltype(lambda)> PointerWithLambda(new MyClass(), lambda);

One bonus when using the operator() over a lambda is that you don’t even have to specify it when constructing new instances of the object as you can see above, assuming the class can be default constructed.

std::shared_ptr

std::shared_ptr requires some different syntax compared to std::unique_ptr. Behind the scenes, std::shared_ptr allocates a ‘control block’ containing the atomic reference counter and other data such as the custom deleter. The image below from Oreilly.com shows it nicely:

When using a custom deleter with shared_ptr we don’t pass any additional template arguments, our custom deleter is passed when creating the object and it exists within the control block.

class MyClass
{
public:
    ~MyClass() { }
};

static void CustomDeleter(MyClass* pMyClass)
{
    delete pMyClass;
}

int main()
{
    //1 - Function
    std::shared_ptr<MyClass> s1(new MyClass(), CustomDeleter);
    
    //2 - Lambda
    std::shared_ptr<MyClass> s2(new MyClass(), [](MyClass* pMyClass) { delete pMyClass; });

    //3 - Custom Class
    class DeleterClass
    {
    public:
        DeleterClass() 
        { 
        
        }
        void operator()(MyClass* pMyClass)
        {
            delete pMyClass;
        }
    };
    DeleterClass d; //Must be CopyConstructible. 
    std::shared_ptr<MyClass> s3(new MyClass(), d);
}

The size of the shared_ptr remains 16 bytes on a 64 bit compiler. One pointer to the object and another pointer to the control block. Depending on the implementation, the size of the control block could change if a custom deleter is or isn’t allocated.

On MSVC 2019, using std::shared_ptr by default, the control block size is 24 bytes. The size of the control block can increase depending on the type of deleter used. Using a lambda or class with an operator() incurs no additonal storage overhead. Using a function pointer will increment the size by the cost of a pointer and using more complex types such as std::function will increase storage further, as it does with std::unique_ptr.

Note: Unfortunately you cannot use a custom deleter with std::make_shared (nor with std::make_unique). Something else interesting to know about std::shared_ptr is that it’s more optimal to use std::make_shared() rather than std::shared_ptr<T>(new T()) because internally the implementation needs to allocate a control block so if you provide your own pointer, it has to call ‘new’ to allocate its own control block. If you called make_shared(), it will allocate the memory for your data and the control block in the same allocation!

Closing thoughts

When wanting to use a custom deleter with a std::unique_ptr and you want it to be the same function for all objects, use a custom class with operator() as this incurs the least overhead, can be inlined at runtime and doesn’t increase the size of unique_ptr.

If you’re wanting to call a different function for each of your unique_ptrs, opt for a straight up function pointer/ lambda. The only additional overhead is the cost of storing the function pointer.

For std::shared_ptr, the storage overhead of the deleter is stored in the control block only once instead of for every object like with std::unique_ptr, so it’s cheaper to use a complex delete type with larger storage requirements.

16 responses to “C++ unique/shared ptr custom deleters”

  1. Looking for a fresh online gaming experience? Check out g9777mx they seem to have a nice range of games. I am going to try it out this weekend. You can find them here: g9777mx

  2. Bets74 caught my eye recently. They seem to have a decent platform and a wide variety to bet on. Don’t take my word for it, see for yourself bets74!

  3. Yo, casinooxxo surprised me, actually! The gameplay is surprisingly good, and they have a decent variety of games. I’m not complaining! Well worth your time! Take a look at casinooxxo

  4. I would like to show my appreciation for your kind-heartedness giving support to folks that need guidance on this particular question. Your real dedication to getting the message around appears to be exceptionally significant and have surely made ladies just like me to realize their ambitions. Your personal informative guide entails a whole lot to me and far more to my fellow workers. Regards; from everyone of us. Walter Linko

  5. Nam a enim id odio rhoncus dapibus non in leo. Curabitur vitae tempor orci. Ut ipsum tortor, pellentesque at vulputate at, imperdiet sed est. Duis tristique dolor et dui maximus congue. Donec rutrum velit ut metus suscipit dapibus. Duis convallis vestibulum finibus. Maecenas laoreet metus sed mi dapibus, nec scelerisque dolor tincidunt. Donec ultrices erat tellus, vitae egestas eros faucibus id. Booker Munnell

  6. would love to forever get updated outstanding weblog! .

  7. I love it when people get together and share thoughts. Great website, keep it up!

  8. Мережевий простір України зустрів свіжий тематичний проєкт — збірку інтернет-ресурсів, створений для агрегації численні веб-ресурси країни.

    Зазначений ресурс збирає посилання на сайти, що висвітлюють найрізноманітнішу тематику. Каталог включає ресурси як загальнонаціонального рівня, а також ті, що концентруються на розвитку локальних територій.

    Головне завдання проєкту — стати універсальним провідником для відвідувачів, які шукають актуальні місцеві медіа на різний інтерес: як-от оперативні новини чи політичне життя до матеріалів з історії, трендів для молоді, лайфстайлу, активізму та експертних думок.

    Представлений навігатор націлений на пересічних громадян та запрошує до партнерства з засобами масової інформації, представниками преси та рекламодавцями, які прагнуть бути помітними в українському інформаційному полі

  9. Днями випадково знайшов веб-сторінку, який я сприйняв за пересічний довідковий ресурс. Це сайт Retro і знаходиться за адресою https://retro.ua/.

    Відкривши головну сторінку, я побачив досить неочікуваний перелік рубрик: публікації про місячні фази, правила пунктуації в українській мові, рекомендації щодо визначення вагітності, перелік святкових днів і навіть анонси розпродажів на кшталт “Чорної п’ятниці”. Справжній інформаційний коктейль!

    Це привернуло мою увагу, і пішов вивчати глибше. В процесі зрозумів, що на сайті представлено безліч статей на побутові та освітні сюжети: як-от медичні рекомендації до культурних особливостей та правопису. Навіть із назвою “Retro”, його зміст — це корисні знання, що знадобляться щодня.

    Найкраще пригадую матеріал із пунктуації — там зрозуміло розтлумачені норми, що згадуються з навчання доволі розмито. Звернув увагу на текст про народні традиції у 2026 році. У результаті, портал став оригінальним міксом календаря, енциклопедії та довідника, на якому є відповіді на багато різноманітних питань.

  10. Активно шукала, де купити постіль, рушники, пледи, щоб матеріал був ніжним, шви рівними, а вартість адекватною. Переглянула кілька інтернет-магазинів і натрапила на один тлумачний проєкт. Асортимент вражає — є і бюджетна бязь, і дорогий турецький люкс, також є кухонний текстиль і приладдя для ванни. На сайті hometextiles.com.ua доставляють по Україні швидко, з поверненням проблем немає, до того ж часто бувають приємні знижки за промокодами.

  11. Шукав собі свіжий набір текстилю для ліжка і натрапив на саме цей сайт. Взяв собі комплект із сатину – спати дуже комфортно. Ось вирішив поділитися, що там є.

    Які товари є в наявності:
    – Бюджетна бязь, сатиновий матеріал, гіпоалергенний перкаль, натуральний льон, щільний поплін, вдосконалений ранфорс
    – Полуторні, двоспальні комплекти, євро-комплекти та комплекти з двома підковдрами
    – Простірадла з резинкою
    – Наволочки 50×70 та 70×70

    Позитивні моменти:
    – Пропозиції на будь-який гаманець (від 800 до 4000+ грн)
    – Вказують щільність тканини (для бязі 110–145 г/м², для сатину 120–170 г/м²)
    – Пишуть про сертифікацію OEKO-TEX – для алергіків важливо
    – Є сімейні набори з двома підковдрами – кожен спить під своєю ковдрою

    Ось основні категорії:
    – Для економії – бязь чи ранфорс (служать 5–7 років)
    – Преміум – сатин чи перкаль (вистачає до 10 років)
    – Влітку рятує – льон (дарує прохолоду, але потребує прасування)
    – Для пар – набори з двома ковдрами

    У статтях пишуть: завжди міряйте свій матрац і ковдру перед замовленням, бо розміри у різних брендів можуть відрізнятися на 5–10 см.

    Я зупинився на сатині – приємна текстура, не електризується. Родина в захваті. Якщо шукаєте якісну постіль – гляньте.

    Хто що з цього брав? Розкажіть, яка тканина краще

  12. Здоровенькі були! Вирішив показати знахідкою, раптом комусь із вас треба. Останнім часом прямо біда відчув, що сплю гірше, кручусь до ранку, а зранку відчуваю себе, ніби й не лягав. Думав на нерви, на дощі, а дівчина видала: “Пора поміняти постіль на нормальну, а не цей синтетичний жах з ринку”. І тут я поліз в мережу.

    Якщо чесно, був впевнений, що підбір постільної білизни – це просто “колір сподобався чи ні”. Виявилось, то цілий всесвіт. Там тобі бязь, ранфорс, і сатин… А я в таких назвах був нуль, поки не зайшов на сайт postilnabilyzna.com.

    Хлопці, це просто джерело корисної інфи! Я провів майже годину. У них все як в довіднику: чітко описані всі тканини, від дешевої бязі до люксового сатину та льону. Навіть там є порівняння з описом щільності та того, скільки там циклів прання витримає матеріал. Це реально допомогло мені в’їхати, чому якийсь набір коштує 800 грн, а другий — 2500.

    Кілька відкриттів особисто виніс:
    – Виявляється, наші та євро розміри сітки суттєво різняться, і перш ніж купувати реально бігати з сантиметром міряти свою ковдру, а не просто вірити напису «двоспальний».
    – От чесно, не знав, що фланель влітку — це жах, а сатин реально охолоджує, тому що в нього структура специфічна.
    – На сайті написано, як правильно прати, щоб принт не зліз після кількох прань. Це прям в точку для нас, у кого пралка працює без відпочинку.

    У підсумку вирішили придбати спочатку один сатиновий набір від вітчизняного бренду (підтримали так би мовити українське). Поки все чудово — сплю як немовля, білизна приємна до тіла, не ковзає й не електризується.

    Тому, якщо ви, як і автор, до останнього часу думали, що підковдра — це не те, в що варто вникати, щиро рекомендую почитати огляд на цьому ресурсі. Це дійсно економить час на підбір та вберігає від покупки неякісної речі. Всім гарного сну!

  13. Тут постійно зустрічаю пости в стилі “де берете новини?” або “як перетравлювати потік інфи”. Я й сам часом заплутуюсь, коли в збереженому безліч вкладок, а половина з них — якесь незрозуміле щось. Ось нещодавно натрапив на простий сайт – newsgidcat.space.

    Поясню одразу: це не ще один новинар, де вам прагнуть прищепити єдину правильну думку. Це, власне, каталог-гід. Це як бібліотекаря, який без зайвих слів кладе перед вами перелік надійних видань, а що обрати — вирішуйте вже самі.

    Чим це зручно

    По-перше, мінімалізм. Жодної реклами на пів екрана, жодних клікбейтних банерів “ШОК! ТРАМП ЗНОВУ…”. Просто сіро-білий фон і список лінків. Відкривається моментально, навіть тоді, коли мобільний інтернет на нулі.

    Друге, це своєрідний “батьківський контроль” для самого себе. Зайшов сюди і вже точно не наступиш випадково на якийсь смітник чи підробну “Українську правду” з підробленим доменом.

    Якщо чесно, закинув сторінку в обране як стартову точку для початку дня. Допомагає, коли є бажання одним оком подивитись, що публікують різні видання, не гаючи дорогоцінний час на блукання.

    Кому цікаво мати напоготові компактний перелік українських ЗМІ — раджу зазирнути. На мій погляд, штука в господарстві потрібна. Всім тиші та тільки перевірених новин!

  14. Шукаєте якісні інформаційні ресурси України? Зверніть увагу на hiobzor.space – тут зібраний свіжий перевірений список українських медіа. Неупередженість, швидкість та різноплановість думок – основні вимоги до включення в каталог. У каталозі ви знайдете як обласні інформаційні портали, так і загальноукраїнські агентства з розслідуваннями, аналітикою та ексклюзивними матеріалами. Обирайте своє джерело новин разом з hiobzor.space!

Leave a Reply

Your email address will not be published. Required fields are marked *