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,所以我无法使用扩展初始化列表等等。
答案 0 :(得分:1)
静态成员变量基本上是一个奇特的全局变量。特别是该映射的构造函数在该程序的执行中只调用一次,而不是每个TrackSymbol对象调用一次。 (但是, 保证在执行int main()
中的第一行之前运行。)
很难说清楚你说的是什么,但我的猜测是你在_trackTypeToIdentificationCodeMap
的构造函数运行之前已经实例化了一个TrackSymbol对象,例如在{{1}之前定义的全局变量中或者在另一个文件中。立即解决方法是移动该定义。一个更好的修复可能是使该成员变量非静态(如果你能负担得起性能)或使用单例函数(在旧的C ++版本中,这不保证是线程安全的):
_trackTypeToIdentificationCodeMap