我不能在这里列出MCVE,因为它太长了。我在自己编写的STL内存分配器中遇到问题,但在全局对象中使用 时会出现问题[e.q.不在函数中]:
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
是我的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
在崩溃前显示两次。
答案 0 :(得分:0)
我现在总结所有评论,例如答案,但答案属于用户n.m.
:
static initialization order fiasco
(C)n.m.
get....()
函数中。现在它就像一个魅力。