在将局部向量复制到地图中某个键的值时遇到段错误

时间:2017-08-01 16:25:47

标签: c++ vector stl segmentation-fault

class TrackSymbol
{
        protected: static std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap ;

        protected: static char _identificationCodeChars[][2] ;
} ;

在实施文件中:

std::map<int, std::vector<char> > TrackSymbol::_trackTypeToIdentificationCodeMap ;

char TrackSymbol::_identificationCodeChars[][2] =
{
    { ' ', ' ' },
    { 'S', '6' },
    { 'Z', 'U' }
} ;

在构造函数中,我试图用_identificationCodeChars中的适当值填充本地向量,但是在副本中遇到段错误:

    for ( int i = 0 ; i < sizeof( _identificationCodeChars ) / sizeof( _identificationCodeChars[0] ) ; i++ )
    {
        std::vector<char> vec ;
        vec.push_back( _identificationCodeChars[i][0] ) ;
        vec.push_back( _identificationCodeChars[i][1] ) ;

        _trackTypeToIdentificationCodeMap[i] = vec ; //Segfault here
    }

我的理解是赋值运算符会对局部向量进行硬拷贝,所以我对它为什么会遇到分段错误感到有点困惑。另外,在我目前的环境中,我只限于C98,所以我无法使用扩展初始化列表等等。

1 个答案:

答案 0 :(得分:1)

静态成员变量基本上是一个奇特的全局变量。特别是该映射的构造函数在该程序的执行中只调用一次,而不是每个TrackSymbol对象调用一次。 (但是, 保证在执行int main()中的第一行之前运行。)

很难说清楚你说的是什么,但我的猜测是你在_trackTypeToIdentificationCodeMap的构造函数运行之前已经实例化了一个TrackSymbol对象,例如在{{1}之前定义的全局变量中或者在另一个文件中。立即解决方法是移动该定义。一个更好的修复可能是使该成员变量非静态(如果你能负担得起性能)或使用单例函数(在旧的C ++版本中,这不保证是线程安全的):

_trackTypeToIdentificationCodeMap