2012-03-21 15 views
5

Tengo un problema al trabajar con vectores de una clase. Intenté reducir el código todo lo posible, dejándome el código a continuación. Sin embargo, después de hacer esto, todavía no puedo entender por qué mi programa está fallando. Vengo de un mundo de VBA y mis habilidades de depuración de C++ son pobres, por decir lo menos, y me disculpo por eso desde el principio. Cualquier orientación para mejorar mi habilidad aquí será aceptada con mucho gusto.colisiones de vector.push_back()

Mi clase:

class Tester { 
public: 

    int varA; 
    int varB; 

    Tester() { 
     varA = 1; 
     varB = 1; 
    } 

    Tester(Tester& P1, Tester& P2) { 
     varA = P1.varA + P2.varA; 
     varB = P1.varB + P2.varB; 
    } 

    Tester(const Tester &Source) { 
     varA = Source.varA; 
     varB = Source.varB; 
    } 

}; 

mi prueba de red:
no funciona:

int main() { 
std::vector <Tester> BreakIt; 

    for (int i = 0; i < 2500; i++) { 
     Tester newTester; 
     BreakIt.push_back(newTester); 
     Tester& tempTester = BreakIt.at(0); 
     for (int j = 0; j < 4; j++) { 
      BreakIt.push_back(Tester(newTester, tempTester)); //This is where it crashes. 
     } 
    } 

return 0; 
} 

¿Funciona:

int main() { 
std::vector <Tester> BreakIt; 

    Tester newTester; 
    BreakIt.push_back(newTester); 

    for (int i = 0; i < 2500; i++) { 
     Tester& tempTester = BreakIt.at(0); 
     for (int j = 0; j < 4; j++) { 
      BreakIt.push_back(Tester(newTester, tempTester)); 
     } 
    } 

return 0; 
} 

¿Funciona:

int main() { 
std::vector <Tester> BreakIt; 

    for (int i = 0; i < 2500; i++) { 
     Tester newTester; 
     BreakIt.push_back(newTester); 
     Tester& tempTester = BreakIt.at(0); 
    } 

return 0; 
} 

La línea push_back() que rompe no correr un par de veces antes del accidente. Parece que cuando cambio ciertas cosas y recompilo, el punto en el que falla cambia (es decir, 20 veces a través del ciclo principal frente a 175 veces frente a 1000 veces). Sin embargo, una vez que he compilado, generalmente pasará por la misma iteración cada vez antes de bloquearse.

Sospecho que esto es una especie de 'comportamiento no definido', pero desde donde yo no estoy seguro.

Por favor alguien puede ayudarme a identificar qué BreakIt.push_back(Tester(newTester, tempTester)); no funciona cuando yo quiero que?

+1

Por cierto, no use'for (int i = 1; i <5; i ++) ', es una confusión innecesaria, use'for (int i = 0; i <4; i ++)' en su lugar. Además, estás redefiniendo 'yo' en el ciclo interno, que también es muy confuso y extremadamente propenso a errores. – enobayram

+0

@enobayram ¡Tiene toda la razón en cuanto a la redefinición! – Gaffi

Respuesta

15

Tienes razón, no hay un comportamiento definido.

Usted está tomando una referencia a BreakIt.at(0); sin embargo, este objeto ya no se garantiza que exista después de que haya realizado un push_back, porque si el vector crece, normalmente se copian todos los contenidos y se eliminan los originales.

De http://www.cplusplus.com/reference/stl/vector/push_back/ (no mejor referencia del mundo):

reasignaciones iteradores invalidar toda obtenidos previamente, referencias y punteros.

+0

Bueno, eso fue originalmente 'for (int iTesterLoop = 0; iTesterLoop <(int) BreakIt.size(); iTesterLoop ++) {' 'seguido de probador y tempTester = BreakIt.at (iTesterLoop);' pero esto era aún no funciona, así que estaba tratando de reducir el código aún más. Lo anterior en este comentario todavía no funcionó. – Gaffi

+0

Ok. ¿Es posible/aceptable entonces crear otro vector, agregar mis nuevos elementos en el ciclo y luego agregar los elementos del vector temporal al original fuera del ciclo? ¿Hay una mejor alternativa? – Gaffi

+0

@Gaffi: Podrías hacerlo, pero ¿por qué no simplemente 'BreakIt.push_back (Tester (newTester, BreakIt.at (0)))'? –

Cuestiones relacionadas