2010-10-01 53 views
5

A veces recibo (aleatoriamente) una inicialización incorrecta de los valores, lo que me hace pensar que estoy usando memoria sin inicializar en alguna parte. Mi estructura principal de datos es:C++ ¿Memoria no inicializada?

template <class state> 
class learnedStateData { 
public: 
    learnedStateData() :gCost(DBL_MAX), hCost(0), isDead(false) {} 
    state theState; 
    double gCost; 
    double hCost; 
    bool isDead; 
}; 

Esto se almacena en un hash_map STL. ¿Alguna idea sobre cómo podría obtener datos no inicializados (además del estado) de esta estructura de datos?

Déjenme aclarar: no quiero que mis valores no se inicialicen, pero a veces parecen ser aleatorios.

+2

Además de theState ha inicializado correctamente cada miembro de su clase. Por lo tanto, no inicializar el Estado podría ser la fuente del problema. –

+1

Si 'state' tiene un constructor predeterminado, se llama automáticamente, por lo que no es necesario llamarlo explícitamente. Sin embargo, si no hay un constructor predeterminado, esa es otra historia. –

+1

* cómo podría obtener datos no inicializados (además del theState) * ... ¿Con esto a qué ** datos ** se refiere que no está inicializado? Además de 'theState', otros datos que se muestran en la' clase' parecen haberse inicializado correctamente ... – liaK

Respuesta

4

La implementación es perfectamente válida ... su problema debe ser otro. Puede usar una herramienta como valgrind para verificar accesos de memoria no válidos, lecturas no inicializadas, etc. Podría agregar algunas afirmaciones para intentar reducir el punto donde el estado está dañado. Si proporciona un algoritmo hash, asegúrese de que devuelve el mismo valor de manera consistente para el mismo valor clave. Compruebe que de alguna manera no modifique la clave de un objeto mientras está dentro del contenedor. Puede cambiar en un estándar :: map <> y ver si el problema desaparece.

+0

Termina la implementación es sonido, como dices. El problema era que tenía una referencia a una instancia en el hash_map que se restablecía al azar cuando el hash_map cambiaba de tamaño. –

+1

Me alegra oír que encontraste el error. Aclamaciones. –

3

No ha inicializado theState dentro del constructor

Uso Value Initialization

template <class state> 
class learnedStateData { 
public: 
    learnedStateData() :theState(),gCost(DBL_MAX), hCost(), isDead() {} 
    state theState;  ^      ^  ^
    double gCost;   |_________________________|__________| 
    double hCost;       | 
    bool isDead;      Value Initialized 
}; 
+4

¿Cómo es eso relevante? La pregunta se sale de su camino para decir que el Estado no es el problema, y ​​la inicialización del valor no es más confiable que los valores explícitos proporcionados en la pregunta. –

+0

@ Tony: ¿Cómo no es confiable la inicialización de valores? ¿Cómo puede alguien automágicamente decidir exactamente cuál es el problema simplemente mirando el código provisto? ¿Puedes? El único problema que pude ver fue que 'theState' no se inicializó. Además, ¿cómo podía decir con tanta confianza que el objeto/variable no inicializado no causaba ningún problema? –

+3

@Prasoon: No estoy diciendo que la inicialización de valor no sea confiable, estoy preguntando por qué crees que sería _más_ confiable. Mi opinión es que los miembros de los datos ya se han inicializado correctamente, y proporcionar una forma alternativa de hacer lo mismo no ayudará. El problema está en otra parte de la vida del objeto. Él puede estar seguro de que el Estado no es relevante porque uno o más de los otros campos están siendo corrompidos, y el Estado no es relevante para su procesamiento. –

4

¿Es posible que usted tiene un iterador inválida o puntero a una learnedStateData<T> en alguna parte?

Cuestiones relacionadas