C ++ Linux: Das Deklarieren eines Arrays in einer Klasse verursacht einen Segmentierungsfehler

Ich habe eine Klasse, und wenn ich versuche, die folgende Deklaration in der Header-Datei hinzuzufügen:

bool m_DeviceIDs[100];

Ich bekomme einen Segmentierungsfehler. Irgendwelche Ideen warum? Der gesamte Klassenkopf:

class Protocol
{
    vector _DeviceProtocols;
    vector* _Devices;
    Helper _Helper;
    vector  m_MessageToSend;//xml messages to send
    bool m_LockDevices;
    //bool m_DeviceIDs[100];
    unsigned int GetVacantID();
public:
    Protocol(void){};
    Protocol(vector* devices);
    ~Protocol(void);
    void RemoveDevice(int DeviceID);
    void AddDevice(Device device);
    bool SendPing( int DeviceID);
    bool GetInputStatus( int DeviceID);
    void GetLowLevelConfiguration(int DeviceID);
    bool ActivateOutput(char outputID, bool state, int DeviceID);
    bool ActivateBSUHF(unsigned char state, int DeviceID);
    bool ActivateUnitLF(unsigned char state,int DeviceID);
    void StartDeviceListeners();
    void WriteMessageToDevice(int DeviceID, unsigned char* message, int length);
    vector CollectDataFromDevice(int DeviceID,int dataLength);
    int GetDeviceAvailableDataLength(int DeviceID);
    void RefreshServerDetails(int DeviceID, string host, int port,int reconnectInterval);
    void ReconnectHost(int DeviceID);
    void SendVersion(int,bool);
    void StartListentoDevice(int DeviceID);
    void StopListenToDevice(int DeviceID);
    bool SendSetLowLevelConfiguration(LowLevelConfiguration llConfig, int WaitAckMS,     bool FromBaseToLocator,int DeviceID);
    bool OperateExciterRead(char operation, unsigned int ReaderID, int Retries,int DeviceID);
    bool RequestConfigurationFromLocator(int ReaderID,int TimeOut, int Retries,int DeviceID);
    void SendXMLMessage(unsigned char opcode,   vector XMLData,unsigned int MessageID, unsigned int SourceID, unsigned int DestID);
    void Mute(int Length, int DeviceID);
};
0
@JoachimPileborg: Wie ich bereits erwähnt habe, habe ich es ausprobiert, ohne es zu benutzen (zum Debuggen)!
hinzugefügt der Autor user1997268, Quelle
@ JoachimPileborg: Es ist die Erklärung. Für Debug-Zwecke habe ich die Deklaration verlassen, aber die Verwendung der deklarierten Variablen entfernt, aber ich habe immer noch den Segmentierungsfehler. Nur wenn ich die Deklaration entferne, bekomme ich den Fehler nicht.
hinzugefügt der Autor user1997268, Quelle
@blackbird: Nein - es sollte in der Tat eine Reihe von Bool sein
hinzugefügt der Autor user1997268, Quelle
Das Ändern der m_DeviceIDs zu std :: bitset <100>, wie in der Antwort unten vorgeschlagen, löste das Problem - aber ich frage mich immer noch, warum es nicht mit Booleans funktioniert ...
hinzugefügt der Autor user1997268, Quelle
@Apokal: Ich verwende diese Klasse an Tausenden von Stellen im Programm. Ich deklariere es in einer Singleton-Klasse namens Som.cpp: _Protocol = Protocol (& m_pDevices); ein Beispiel für eine Verwendung davon: Som :: Instance() -> GetProtocol (). StopListenToDevice (1);
hinzugefügt der Autor user1997268, Quelle
Vielleicht passiert es, wenn du es benutzt. Im Debug-Modus werden boolesche Werte normalerweise auf false initialisiert, während sie im release-Modus auf true gesetzt werden (weil sie nicht initialisiert sind und Speicher normalerweise von Null verschieden ist). Stellen Sie sicher, dass Sie Ihr Array auf konsistente Weise initialisieren, bevor Sie es verwenden.
hinzugefügt der Autor Jepessen, Quelle
Es ist nicht die Deklaration, die den Absturz verursacht, es ist, wie Sie die deklarierte Variable verwenden. Kompilieren Sie Ihr Programm mit Debug-Informationen (verwenden Sie das -g Flag beim Kompilieren) und führen Sie einen Debugger aus, um zu sehen, wo der Absturz auftritt.
hinzugefügt der Autor Some programmer dude, Quelle
Dann müssen Sie Valgrind oder einen Debugger verwenden, um die Ursache des Fehlers zu finden. Sie machen irgendwo im Code, den Sie uns nicht zeigen, etwas Seltsames, und es ist nicht die eigentliche Membervariablendeklaration. Deklarieren Sie ein Array dieser Klasse irgendwo und es ist zu groß für den Stack mit dem Member? Aktivieren Sie auch weitere Warnungen beim Kompilieren, da Warnungen oft ein Indikator für undefiniertes Verhalten sind, wenn Sie das Problem beheben.
hinzugefügt der Autor Some programmer dude, Quelle
Sehen Sie sich den Kommentar von @Jepessen an und denken Sie daran, dass nicht initialisierte Daten (wie ein nicht initialisiertes Array) unbestimmte Werte enthalten. Die Verwendung nicht initialisierter Daten führt zu undefiniertem Verhalten. Und ein Debugger löscht normalerweise Daten (d. H. Initialisiert), weshalb einige Dinge beim Ausführen in einem Debugger funktionieren könnten.
hinzugefügt der Autor Some programmer dude, Quelle
Verwenden Sie auch Tools wie Valgrind , um Speicherprobleme zu finden.
hinzugefügt der Autor Some programmer dude, Quelle
Dein Code hat Fehler. Das Hinzufügen des Arrays macht die Fehler in Form eines segfault verfügbar. Sie müssen die Ursache finden. Da Sie ein Zeigerelement haben und eine Zuweisung als Beispiel angeben, aber den Zuweisungsoperator oder den Kopierkonstruktor anscheinend nicht implementiert haben, sollten Sie mit der Implementierung beginnen.
hinzugefügt der Autor molbdnilo, Quelle
Ist es möglich, dass Code mit der Klasse verwendet wird, die beim Ändern der Kopfzeile nicht neu erstellt wird? Sind Ihre Makefiles (oder welche Build-Skripts, die Sie verwenden) korrekt?
hinzugefügt der Autor Michael Burr, Quelle
Ihr Problem liegt nicht in dem Code, den Sie angezeigt haben.
hinzugefügt der Autor Benjamin Bannier, Quelle
Sollte m_DeviceIDs ein Array von int s anstelle von bool s sein?
hinzugefügt der Autor blackbird, Quelle
Zeigen Sie Code an, bei dem der Segmentierungsfehler tatsächlich auftritt.
hinzugefügt der Autor Blacktempel, Quelle
@ user1997268, ok, habe es, dann ist mein einziger Vorschlag, mit m_DeviceIDs -Typen zu "spielen", probiere int oder vector
hinzugefügt der Autor Apokal, Quelle
Es ist ein bisschen schwierig zu sagen, wo das Problem liegt, ohne zu sehen, wie man die gegebene Klasse benutzt (schlechte Speicherverwaltung, Rennbedingungen, etc.), vielleicht kannst du ein kleines Beispiel vorbereiten oder mehr Kontext geben?
hinzugefügt der Autor Apokal, Quelle
Sollte vector * _Devices; ein vector _Devices; sein - kein Zeiger auf Vektor, sondern Vektor von Zeigern wie _DeviceProtocols ?
hinzugefügt der Autor Apokal, Quelle
Versuchen Sie, die m_Devices-Deklaration an den Anfang der Klasse zu verschieben. Verschwindet der Segfault? Dann wird der segfault wahrscheinlich nicht von ihm verursacht. Es ist ein Nebeneffekt eines Fehlers, den Sie irgendwo anders in Ihrem Code gemacht haben, was sich darin äußert, dass m_DeviceIDs am unteren Rand hinzugefügt werden. Mein Geld ist auf einigen unzulässigen Speicherzugriff wie Out-of-Grenzen Array-Zugriff.
hinzugefügt der Autor nedR, Quelle

1 Antworten

0
hinzugefügt
Tatsächlich funktioniert es mit Bitset. Ich frage mich immer noch, warum es nicht mit Boolean funktioniert ...
hinzugefügt der Autor user1997268, Quelle