Пользовательский распределитель с вектором STL (в наборе инструментов Visual Studio) - PullRequest
0 голосов
/ 21 сентября 2018

При использовании пользовательского распределителя с вектором STL (в пределах цепочки инструментов Visual Studio) конструктор вызывается 3 раза, а деструктор вызывается 4 раза.Что мне не хватает?Ниже приведен код и его выходные данные:

#include <iostream>
#include <stdlib.h>
#include <new>
#include <memory> 
#include <vector>

using namespace std;

template <class T>
struct Mallocator
{
    typedef T value_type;
    Mallocator() noexcept { cout << "Mallocator() " << this << endl; }
    ~Mallocator() noexcept { cout << "~Mallocator() " << this << endl; }

    template<class U> Mallocator(const Mallocator<U>&) noexcept { cout << "Mallocator(const Mallocator<U>&) " << this << endl; }
    template<class U> Mallocator(Mallocator<U>&&) noexcept { cout << "Mallocator(Mallocator<U>&&) " << this << endl; }

    template<class U> bool operator==(const Mallocator<U>&) const noexcept
    {
        return true;
    }
    template<class U> bool operator!=(const Mallocator<U>&) const noexcept
    {
        return false;
    }
    T* allocate(const size_t n) const;
    void deallocate(T* const p, size_t) const noexcept;
};

template <class T>
T* Mallocator<T>::allocate(const size_t n) const
{
    cout << "   allocate from" << this << endl;
    if (n == 0)
    {
        return nullptr;
    }
    if (n > static_cast<size_t>(-1) / sizeof(T))
    {
        throw std::bad_array_new_length();
    }
    void* const pv = malloc(n * sizeof(T));
    if (!pv) { throw std::bad_alloc(); }
    return static_cast<T*>(pv);
}

template<class T>
void Mallocator<T>::deallocate(T * const p, size_t) const noexcept
{
    cout << "   deallocate from" << this << endl;
    free(p);
}

int main()
{
    Mallocator<uint8_t> mall{};
    std::vector<uint8_t, Mallocator<uint8_t>> v(mall);
    return 0;
}

Ниже приведены выходные данные:

Mallocator() 0058FDF3
Mallocator(const Mallocator<U>&) 0058FADF
        allocate from0058FADF
~Mallocator() 0058FADF
Mallocator(const Mallocator<U>&) 0058FAF3
        deallocate from0058FAF3
~Mallocator() 0058FAF3
~Mallocator() 0058FDD8
~Mallocator() 0058FDF3

Кроме того, даже без использования вектора распределитель уже был создан 3 (или, возможно, 4раз деструктор вызывался 4 раза), что очень много по сравнению с цепочкой инструментов GCC, которая создает его только один раз.

1 Ответ

0 голосов
/ 21 сентября 2018

Я добавил конструкторы копирования и перемещения в ваш код в template <class T> struct Mallocator

Mallocator(const Mallocator&) { cout << "Mallocator&() " << this << endl; }  
Mallocator(const Mallocator&&) { cout << "Mallocator&&() " << this << endl; } 

И это вывод, который я получаю с GCC 7.1.0:

Mallocator() 0x61fe3f
Mallocator&() 0x61fe20
~Mallocator() 0x61fe20
~Mallocator() 0x61fe3f

количество вызовов конструктора и деструктора совпадает на этот раз.Вы также можете проверить это в инструментальной цепочке Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...