Я не могу перечислить здесь 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
отображается дважды перед сбоем.
Что такое 'mapForMemoryContainer'? Это также использует ваш распределитель? – Arunmu
'Он выходит из строя даже до первой строки кода в main()' Есть ли у вас какие-либо проблемы с упорядочиванием инициализации?Нам понадобится еще один контекст для проблемы – Arunmu
Я уверен, что это проблема со статической инициализацией. Я предполагаю, что структура, содержащая 'mapForMemoryContainer', не была инициализирована. Было бы полезно вставить трассировку стека ядра. – Arunmu