При использовании пользовательского распределителя с вектором 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, которая создает его только один раз.