He estado profundizando en C++ recientemente y mis errores parecen ser complejos.C++: ¿Cómo es posible que la lectura de datos pueda afectar la memoria?
Tengo un vector de objetos, cada objeto contiene un vector de flotadores. Decidí que necesitaba crear una matriz plana adicional que contenga todos los valores flotantes de todos los objetos en uno. Es un poco más complejo que eso, pero la esencia del problema es que a medida que recorro mis objetos extrayendo los valores float, en algún momento mi vector de objetos cambia o se corrompe de alguna extraña manera. (Mis operaciones de lectura son todas funciones const)
Otro ejemplo fue con MPI. Acababa de comenzar, así que solo quería ejecutar exactamente el mismo código en dos nodos diferentes con su propia memoria y sin transferencia de datos, todo muy simple. Para mi sorpresa obtuve errores de segmentación y seguimiento después de horas, encontré que una asignación de una variable establecía una variable completamente diferente a NULL.
Así que tengo curiosidad, ¿cómo es posible que las operaciones de lectura puedan afectar a mis estructuras de datos? Del mismo modo, ¿cómo puede una operación aparentemente no relacionada afectar a otra. No podría esperar soluciones a mis problemas con esas breves descripciones, pero cualquier consejo será muy apreciado.
Actualización: Aquí hay un segmento del código, no publiqué originalmente porque no estoy seguro de cuánto se puede extraer sin entender todo el sistema.
Una cosa que acabo de descubrir es que cuando dejé de asignar el valor a mi matriz plana y simplemente cout'ed en su lugar, desaparecieron los errores seg. Así que tal vez estoy declarando mi arreglo incorrecto, pero incluso si lo fuera, no estoy seguro de cómo afectaría el vector objeto.
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
mi matriz plana es una función miembro
float * flatFitness;
initailsed en el constructor de este modo:
flatFitness = new float(popSize);
Actualización 2:
sólo quiero señalar que la dos ejemplos anteriores no están relacionados, el primero no tiene múltiples hilos. El segundo ejemplo de MPI es técnicamente, pero MPI es memoria distribuida e intenté deliberadamente la implementación más simple que pude pensar, que es ambas máquinas ejecutando código de forma independiente. Sin embargo, hay un detalle adicional, puse en un condtional diciendo
if node 1 then do bottom half of loop
if node 1 then do top half
Una vez más la memoria deben ser aislados, deberían estar trabajando como si no saben nada el uno del otro .. pero retirar esta condicional y haciendo ambos bucles hacen todos los cubos, elimina el error
¿Se puede publicar una versión resumida de su código? Desde este punto, es muy difícil saber qué podría estar pasando. – tgamblin
¿Podría publicar el código del bucle en el que itera los objetos en el vector ... posiblemente está caminando sobre la memoria allí? – Balk
Las operaciones de lectura no cambian los valores. Debe haber algo más en tu código. Su segundo ejemplo es una situación típica de una variable que apunta al lugar equivocado. – fbinder