Как shared_ptr определяет необходимость вызова delete [] или delete - PullRequest
1 голос
/ 19 февраля 2020

Мне любопытно узнать, как класс shared_ptr решает, должен ли он вызывать delete или delete[] для приведенных ниже операторов?

a. boost::shared_ptr <char> ptr(new char);

б. boost::shared_ptr <char []> ptr(new char[100]);

1 Ответ

3 голосов
/ 19 февраля 2020

Это делается через специализацию шаблона. Вот простая демонстрация.

#include <iostream>
#include <type_traits>

template<typename T>
struct foo
{
    foo( T* d ) : m_data{ d } {  }
    ~foo() {
        if ( m_data )
        std::cout << "delete called." << std::endl;
    }

private:
    T* m_data {};
};

template<typename T>
struct foo<T[]>
{
    foo( T* d ) : m_data { d } { }
    ~foo() {
        if ( m_data )
            delete[] m_data;
        std::cout << "delete[] called." << std::endl;
    }
private:
    T* m_data {};
};

int main()
{
    foo<char> inst_1 { new char };
    foo<char []> inst_2 { new char[ 100 ] { 'a' } };
}

онлайн-пример

Для экземпляров T[], экземпляров struct foo<T[]>, поэтому полиморфизм во время компиляции выполняется через специализацию шаблона и smart_ptr обрабатывает освобождение как массивов, так и нормальных типов с помощью этой функции.

...