2016-06-21 2 views
1

Я не могу перечислить здесь MCVE, потому что он слишком длинный. У меня проблема в моем собственном письменном сборнике памяти STL, но только, когда он используется в global объект [e.q. не в функции]:ошибка сегментации в моем собственном модуле памяти STL

class Heap 
{ 
    static FaF::string heapString; 
}; 

FaF::string Heap::heapString("heapString"); 

FaF мой namespace, в котором string определяется следующим образом:

namespace FaF 
{ 
    using string = std::basic_string<char, std::char_traits<char>, Allocator<char>>; 
} 

Allocator мой Allocator СТЛ памяти.

В Allocator шаблоне у меня есть этот код:

T* allocate (std::size_t num, const void* hint = 0) 
{ 
    T * allocatedPointer = static_cast<T*> (getNextAvailableFreePointer(num)); 
    ... 

Катастрофа находится в функции getNextAvailableFreePointer в этой строке:

mapForMemoryContainer.emplace(alignedMemorySize, MemoryContainer()); 

MemoryContainer просто очень простая структура.

Мой вопрос:

Почему сбой программы, когда глобальный объект STL использует мой Allocator? Я тестировал очень сложный класс Allocator, и он работает правильно [нет утечек памяти ..], но при этом одном из условий он сработает.

Он падает даже до первой строки кода в main().

Update:

mapForMemoryContainer является std::map определен в базовом классе:

class Allocator_Base 
{ 
    public: 
     Allocator_Base() { printf("in Allocator_Base constructor\n"); } 

    protected: 
     static std::map<int, MemoryContainer> mapForMemoryContainer; 
     ... 
} 

И Allocator шаблон определяется следующим образом:

template <typename T> 
class Allocator : public Allocator_Base 
{ 

Это все. Текст in Allocator_Base constructor отображается дважды перед сбоем.

+0

Что такое 'mapForMemoryContainer'? Это также использует ваш распределитель? – Arunmu

+0

'Он выходит из строя даже до первой строки кода в main()' Есть ли у вас какие-либо проблемы с упорядочиванием инициализации?Нам понадобится еще один контекст для проблемы – Arunmu

+0

Я уверен, что это проблема со статической инициализацией. Я предполагаю, что структура, содержащая 'mapForMemoryContainer', не была инициализирована. Было бы полезно вставить трассировку стека ядра. – Arunmu

ответ

0

Резюмирую Теперь все комментарии в чем-то вроде ответа, но ответ принадлежит пользователю n.m.:

  1. Это был static initialization order fiasco (C) n.m.
  2. я реализовал свой комментарий в этом ответе и переехал все разумные объектов на отдельные get....() функции.

Теперь это работает как шарм.

+2

Самый простой и надежный способ - переместить статическую переменную в функцию. Используйте 'static std :: map & getMemoryMap() {static std :: map memoryMap; return memoryMap; } 'Это гарантирует инициализацию' memoryMap', прежде чем 'getMemoryMap' вернется в первый раз. –

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