2017-08-01 3 views
1
class TrackSymbol 
{ 
     protected: static std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap ; 

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

Dans le fichier de mise en œuvre:Frapper un segfault lors de la copie vecteur local à la valeur d'une certaine clé sur la carte

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

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

Dans le constructeur, je tente de remplir un vecteur local avec des valeurs appropriées de _identificationCodeChars, mais frapper une erreur de segmentation dans la copie:

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 
    } 

Je crois comprendre que l'opérateur d'affectation fera une copie papier du vecteur local, donc je suis un peu confus sur pourquoi il est Hitt l'erreur de segmentation. En outre, avec mon environnement actuel, je suis limité à C98, donc je ne peux pas utiliser des choses comme des listes d'initialisation étendues, etc.

+1

S'il vous plaît éditez votre question pour qu'elle contienne [mcve] – Slava

Répondre

1

Une variable membre statique est fondamentalement une variable globale fantaisie. En particulier, le constructeur de cette carte est appelé une seule fois dans l'exécution de ce programme, pas une fois pour chaque objet TrackSymbol. (Cependant, il est garanti à courir avant d'exécuter la première ligne int main().)

Il est difficile de dire de tout ce que vous avez dit, mais je pense que vous avez instancié un objet TrackSymbol avant _trackTypeToIdentificationCodeMap ' s Le constructeur a été exécuté, comme dans une variable globale définie avant _trackTypeToIdentificationCodeMap ou dans un autre fichier. La solution immédiate consiste à déplacer cette définition. Une meilleure solution pourrait être de rendre cette variable membre non statique (si vous pouvez vous permettre la performance) ou utiliser une fonction singleton (dans les anciennes versions C++, ceci n'est pas garanti):

std::map<int, std::vector<char> > getCodeMap_internal() 
{ 
    static char _identificationCodeChars[][2] = 
    { 
     { ' ', ' ' }, 
     { 'S', '6' }, 
     { 'Z', 'U' } 
    } ; 
    std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap; 
    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 ; 
    } 
    return _trackTypeToIdentificationCodeMap; 
} 

const std::map<int, std::vector<char> >& getCodeMap() 
{ 
    static std::map<int, std::vector<char> > _trackTypeToIdentificationCodeMap 
     = getCodeMap_internal(); 
    return _trackTypeToIdentificationCodeMap; 
}