C++11 我自己的STL内存分配器中的分段错误
我不能在这里列出MCVE,因为它太长了。我自己编写的STL内存分配器中有一个问题,但只有在全局对象中使用时才会出现问题[e.q.不在函数中]: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<
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
{