C ++ Linux: declarar una matriz en una clase provoca un error de segmentación

Tengo una clase y cuando trato de agregar la siguiente declaración en el archivo de encabezado:

bool m_DeviceIDs[100];

Me sale un error de segmentación. ¿Alguna idea de por qué? Todo el encabezado de clase:

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: Como mencioné antes, lo intenté sin usarlo todo (¡para eliminar fallas)!
agregado el autor user1997268, fuente
@JoachimPileborg: es la declaración. Por motivos de depuración dejé la declaración pero eliminé el uso de la variable declarada, pero aún así obtuve el error de segmentación. Solo cuando elimino la declaración no obtengo el error.
agregado el autor user1997268, fuente
@blackbird: No - debería ser de hecho una serie de bool
agregado el autor user1997268, fuente
la modificación de m_DeviceIDs a std :: bitset <100> como se sugiere en la respuesta a continuación resolvió el problema, pero todavía me pregunto por qué no funciona con booleanos ...
agregado el autor user1997268, fuente
@Apokal: estoy usando esta clase en miles de lugares en todo el programa. Lo declaro dentro de una clase singleton llamada Som.cpp: _Protocol = Protocol (& m_pDevices); un ejemplo para su uso: Som :: Instance() -> GetProtocol (). StopListenToDevice (1);
agregado el autor user1997268, fuente
Quizás sucede cuando lo usas. En el modo de depuración, los valores booleanos generalmente se inicializan a falso, mientras que en modo de lanzamiento a verdadero (porque no se inicializan y la memoria generalmente es diferente de cero). Asegúrese de inicializar su matriz de manera consistente antes de usarla.
agregado el autor Jepessen, fuente
No es la declaración lo que causa el colapso, sino cómo se usa la variable declarada. Compile su programa con información de depuración (utilice el indicador -g al compilar) y ejecútelo en un depurador para ver dónde ocurre el bloqueo.
agregado el autor Some programmer dude, fuente
Luego necesita usar Valgrind o un depurador para ayudarlo a encontrar la causa del error. Está haciendo algo extraño en algún lugar del código que no nos está mostrando, y no es la declaración de la variable de miembro real. ¿Estás declarando una matriz de esta clase en cualquier lugar, y es grande para la pila con el miembro? También habilite más advertencias al compilar, ya que las advertencias a menudo son un indicador de un comportamiento indefinido. Solucionarlas podría solucionar su problema.
agregado el autor Some programmer dude, fuente
Vea el comentario de @Jepessen y recuerde que los datos no inicializados (como una matriz no inicializada) contienen valores indeterminados. El uso de datos no inicializados conduce a un comportamiento indefinido. Y un depurador normalmente borra (es decir, inicializa) los datos y es por eso que algunas cosas pueden funcionar cuando se ejecuta en un depurador.
agregado el autor Some programmer dude, fuente
También use herramientas como Valgrind para encontrar problemas de memoria.
agregado el autor Some programmer dude, fuente
Tu código tiene errores. La adición de la matriz expone los errores en forma de segfault. Necesitarás encontrar la causa raíz. Como tiene un miembro de puntero y publica una asignación como ejemplo, pero aparentemente no ha implementado el operador de asignación o el constructor de copia, debe comenzar por implementarlos.
agregado el autor molbdnilo, fuente
¿Es posible que exista código usando la clase que no se reconstruye cuando modificas el encabezado? ¿Son correctos los archivos make (o los scripts de compilación que está usando)?
agregado el autor Michael Burr, fuente
Su problema no está en el código que mostró.
agregado el autor Benjamin Bannier, fuente
¿Debería m_DeviceIDs ser una matriz de int s en lugar de bool s?
agregado el autor blackbird, fuente
Muestre algún código donde realmente ocurre la falla de segmentación.
agregado el autor Blacktempel, fuente
@ user1997268, ok, lo tengo, entonces mi única sugerencia es "jugar" con los tipos m_DeviceIDs , pruebe int o vector
agregado el autor Apokal, fuente
Es un poco difícil decir dónde está el problema sin ver cómo se usa la clase dada (mala gestión de la memoria, las condiciones de carrera, etc.), ¿tal vez se puede preparar un poco de ejemplo o dar más contexto?
agregado el autor Apokal, fuente
Debería vector * _Devices; ser un vector _Devices; - no un puntero al vector, sino un vector de punteros como _DeviceProtocols ?
agregado el autor Apokal, fuente
Intenta mover la declaración m_Devices a la parte superior de la clase. ¿Desaparece el segfault? Entonces la segfault probablemente no sea causada por ella. Es un efecto secundario de un error que cometió en otro lugar de su código, que se manifiesta al agregar m_DeviceIDs en la parte inferior. Mi dinero está en algún acceso ilegal a la memoria, como acceso a la matriz fuera de límites.
agregado el autor nedR, fuente

1 Respuestas

No hay problema en el código que ha mostrado, pero es posible que desee probar con un std :: bitset en lugar de una matriz bool ya que es más versátil y eficaz en el espacio, algo así como:

#include 
std::bitset<100> m_DeviceIDs;
0
agregado
De hecho, funciona con bitset. Todavía me pregunto por qué no funciona con boolean ...
agregado el autor user1997268, fuente