2014-12-15 3 views
1

Привет, Я написал собственный распределитель с помощью некоторых ресурсов. Он отлично работает для std :: vector, list. Однако для std :: unordered_map конструктор вызывается дважды. Я не почему. Может кто-то, пожалуйста, помогите мне понять статическую инициализацию, которая происходит. Вот кодC++ custom allocator

Файл: helper.h

template<typename T> 
class helper 
{ 
static const size_t init_size = 12; // 0xF4240 max number of entries in the data structure 
public: 
     helper() : 
     alloc_size(
     sizeof(link) > sizeof(T) ? 
     init_size * sizeof(link) : init_size * sizeof(T)), offset(
     sizeof(link) > sizeof(T) ? sizeof(link) : sizeof(T)) 
    { 
     std::cout <<"Initial allocation done" << " I value : " << i << std::endl; 
    } 


}; 

файла: main.cpp

int main() 
{ 
    std::unordered_map<long,long,hash<long>, equal_to<long> , myallocator<pair<const long,long> > >   my_map; 
} 

назвав его таким образом делает помощник constrcutor дозвонились twiced в программе. Это не так для вектора. Есть ли что-то, что я не понимаю в отношении инициализации шаблона. Пожалуйста, помогите

+0

- 1: "constrcutor"? Который из? Отправьте http://stackoverflow.com/help/mcve - тот, который действительно компилируется. Пожалуйста, укажите как то, что вы ожидаете, так и то, что вы получили **, точно **. Вы читали страницы справки «как задать вопрос»? Они должны пройти через это. – Yakk

+0

спасибо за предложение. я внес изменения. – user4362837

ответ

2

Контейнеры могут создавать распределители не только для вашего типа, но и для разных типов через rebind. Это то, что, по-видимому, происходит в вашем случае. Вы не предоставили достаточно кода, чтобы другие могли собрать и проверить его, но вы можете добавить это в конструкторе helper:

std::cout << __PRETTY_FUNCTION__ << std::endl; 

Это работает в GCC и Clang и будут показаны параметры шаблона функции/класс созданный с помощью.

+0

спасибо за предложение. Я попытался поместить это в конструктор помощника, и я получаю следующее. он вызывается с помощью T = std :: __ detail :: _ Hash_node_base *, а затем он вызывается с помощью T = std :: __ detail :: _ Hash_node . Почему это так? Спасибо – user4362837

+0

@ user4362837, потому что ему нужно создавать объекты разных типов ... –

Смежные вопросы