C++ MacOS X-C+中的分段故障11+;

C++ MacOS X-C+中的分段故障11+;,c++,data-structures,static,C++,Data Structures,Static,当我运行下面的代码时,我有一个“segmentationfault11”错误。代码实际上是编译的,但我在运行时得到了错误 //**恐怖** #include <iostream> #include <string> #include <map> using std::map; using std::pair; using std::string; template<typename Tsize> class Terror { publi

当我运行下面的代码时,我有一个“segmentationfault11”错误。代码实际上是编译的,但我在运行时得到了错误

//**恐怖**

#include <iostream>
#include <string>
#include <map>

using std::map;
using std::pair;
using std::string;

template<typename Tsize>
class Terror
{
    public:
    //Inserts a message in the map.
    static Tsize    insertMessage(const string& message)
    {
        mErrorMessages.insert( pair<Tsize, string>(mErrorMessages.size()+1, message) );
        return mErrorMessages.size();
    }

    private:
    static map<Tsize, string>       mErrorMessages;
};

template<typename Tsize>
map<Tsize,string> Terror<Tsize>::mErrorMessages;
#include <iostream>
#include "Terror.h"

typedef unsigned short errorType;
typedef Terror<errorType>   error;
errorType memoryAllocationError=error::insertMessage("ERROR: out of memory.");
在“main()”函数内部,而不是在全局范围内,则一切正常。但是我想在全局范围扩展错误消息,而不是在局部范围。映射是静态定义的,因此“error”的所有实例共享相同的错误代码和消息。你知道我怎样才能得到这个或类似的东西吗


非常感谢。

您需要通过调用
insertMessage
确保
mErrorMessages
的构造函数在使用它之前运行。你可以用任何你想要的方式来做这件事,但你必须以某种方式来做。

我在Mac OS X 10.7上运行我为OS X 10.8编译的应用程序时遇到了同样的问题


将目标设置为10.7解决了问题。该应用程序在10.7和10.8 OS X环境下都能正常运行。

您发布的代码无法编译。请修复它。对不起,我没有看到你的评论,它现在被更正了。问题是在恐怖等级定义之后的“;”。谢谢。它仍然没有编译,因为没有将
Tsize
作为参数的
Terror
构造函数。是的,还有很多代码我没有放在这里,我只是想指出问题的关键部分。我已经解决了。非常感谢。:)谢谢。我已经遵循了您的答案,但是我找不到方法调用“mErrorMessages”的构造函数,以便在全局范围内填充它。您知道可以向我提供的一种方法吗,或者这是不可能的,我应该尝试另一种方法?一种方法是给类一个指向映射的指针,在调用
insertMessage
时,检查指针是否为NULL,如果是,则构造映射。另一种方法是将两个对象放在同一个文件中——同一文件中全局范围的对象是按照它们在文件中出现的顺序构造的。非常感谢,David先生。根据你的回答,这两天我搜索了很多,我得到了我想要的。如果其他人读到了这篇文章,我解决问题的方法是在恐怖模板类中实现以下类:struct codeMaps{~codeMaps(){if(messages){delete messages;messages=0;}}map*messages;};然后我将“mErrorMEssages”定义为:静态代码映射mErrorMEssages;这样,按照David的建议,在每个使用mErrorMessage成员的方法中,我首先检查“mErrorMessage.messages”是否为NULL,以确保在使用它之前创建了映射。codeMaps类的析构函数保证在程序完成时销毁映射,以避免泄漏。
#include <iostream>
#include "error.h"
using namespace std;

int main()
{   
    try
    {
        throw error(memoryAllocationError);
    }
    catch(error& err)
    {
    }
}
errorType memoryAllocationError=error::insertMessage("ERROR: out of memory.");