我自己的STL内存分配器

时间:2016-06-21 15:33:46

标签: c++11 memory-management stl

我不能在这里列出MCVE,因为它太长了。我在自己编写的STL内存分配器中遇到问题,但在全局对象中使用 时会出现问题[e.q.不在函数中]:

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

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

FaF是我的namespacestring的定义如下:

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

Allocator是我的STL记忆分配器。

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()的第一行代码之前就崩溃了。

更新

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在崩溃前显示两次。

1 个答案:

答案 0 :(得分:0)

我现在总结所有评论,例如答案,但答案属于用户n.m.

  1. 这是static initialization order fiasco(C)n.m.
  2. 我在这个答案中实现了他的评论,并将所有明智的对象移动到单独的get....()函数中。
  3. 现在它就像一个魅力。