Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 我自己的STL内存分配器中的分段错误_C++11_Memory Management_Stl - Fatal编程技术网

C++11 我自己的STL内存分配器中的分段错误

C++11 我自己的STL内存分配器中的分段错误,c++11,memory-management,stl,C++11,Memory Management,Stl,我不能在这里列出MCVE,因为它太长了。我自己编写的STL内存分配器中有一个问题,但只有在全局对象中使用时才会出现问题[e.q.不在函数中]: class Heap { static FaF::string heapString; }; FaF::string Heap::heapString( "heapString" ); FaF是我的命名空间,其中字符串的定义如下: namespace FaF { using string = std::basic_string<

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

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

FaF::string Heap::heapString( "heapString" );
FaF
是我的
命名空间
,其中
字符串
的定义如下:

namespace FaF
{
    using string = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
}
崩溃发生在此行的函数
getNextAvailableFreePointer
中:

mapForMemoryContainer.emplace( alignedMemorySize, MemoryContainer() );
MemoryContainer
只是一个非常简单的结构

我的问题:

当一个全局STL对象正在使用我的
分配器时,为什么程序会崩溃?我测试了非常复杂的
分配器
类,它工作正常[没有内存泄漏,…],但在这种情况下它崩溃了

它甚至在
main()
中的第一行代码之前就崩溃了

更新:

MapFormMemoryContainer
是在基类中定义的
std::map

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

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

就这些。分配器基本构造函数中的文本
在崩溃之前会显示两次。

我现在将所有注释汇总为一个答案,但答案属于用户
n.m.

  • 这是一次
    静态初始化命令的失败
    (C)
    n.m.
  • 我在这个答案中实现了他的注释,并将所有可感知的对象移动到单独的
    get….()
    函数中

  • 现在它就像一个符咒。

    我现在将所有评论总结成一个答案,但答案属于用户
    n.m.

  • 这是一次
    静态初始化命令的失败
    (C)
    n.m.
  • 我在这个答案中实现了他的注释,并将所有可感知的对象移动到单独的
    get….()
    函数中

  • 现在它就像一个符咒。

    什么是
    MapFormMemoryContainer
    ?这也使用了您的分配器吗?
    它甚至在main()中的第一行代码之前就崩溃了。
    您有任何静态初始化顺序问题吗?在这个问题上需要更多的上下文,我很确定这是静态初始化的问题。我的猜测是,存放
    MapFormMemoryContainer
    的结构尚未初始化。粘贴核心转储的堆栈跟踪会很有帮助。对不起,这里没有足够的信息,只能进行猜测。你真的需要拿出一个MCVE或者在调试器中一步一步地完成代码。试着做一个MCVE;minimal并不一定意味着很小,但我确信有一些东西可以去掉,但不会影响问题。很可能是静态初始化顺序的失败。在分配器中使用构造函数生成静态变量,在构造函数上放置断点。它是在崩溃之前调用的吗?什么是
    MapFormMemoryContainer
    ?这也使用了您的分配器吗?
    它甚至在main()中的第一行代码之前就崩溃了。
    您有任何静态初始化顺序问题吗?在这个问题上需要更多的上下文,我很确定这是静态初始化的问题。我的猜测是,存放
    MapFormMemoryContainer
    的结构尚未初始化。粘贴核心转储的堆栈跟踪会很有帮助。对不起,这里没有足够的信息,只能进行猜测。你真的需要拿出一个MCVE或者在调试器中一步一步地完成代码。试着做一个MCVE;minimal并不一定意味着很小,但我确信有一些东西可以去掉,但不会影响问题。很可能是静态初始化顺序的失败。在分配器中使用构造函数生成静态变量,在构造函数上放置断点。在崩溃之前调用它吗?最简单、最可靠的方法是将静态变量移动到函数中。使用
    static std::map&getMemoryMap(){static std::map memoryMap;return memoryMap;}
    这保证了
    memoryMap
    在第一次返回之前进行初始化。最简单、最可靠的方法是将静态变量移动到函数中。使用
    static std::map&getMemoryMap(){static std::map memoryMap;return memoryMap;}
    这保证了
    memoryMap
    getMemoryMap
    第一次返回之前进行初始化。
    class Allocator_Base
    {
        public:
            Allocator_Base() { printf( "in Allocator_Base constructor\n" ); }
    
        protected:
            static std::map<int, MemoryContainer>   mapForMemoryContainer;
            ...
    }
    
    template <typename T>
    class Allocator : public Allocator_Base
    {