2011-08-24 7 views
8

Viniendo de un mundo C#, estoy luchando para asegurarme de no introducir pérdidas de memoria y errores en un proyecto C++ al que he sido asignado. Estoy escribiendo código que usa estructuras para analizar información de un buffer de datos. Debido a que la cantidad de estructuras de datos que aparecen en el búfer puede variar en tiempo de ejecución, se usa un vector stl para almacenar los datos procesados. Me encontré con el siguiente bloque de código en el software existente, y estoy luchando para entender por qué funciona:Administrar el alcance y el objeto de por vida dentro de los vectores STL

MyVectorOfObjects.clear(); 
for (unsigned __int8 i = 0; i < NumberOfObjects; i++) 
{ 
    MyParserObject parserObject;    // Declaring without 'new'? 
    parserObject.Decode(buffer, offset, size); // A method on the struct. 
    MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope? 
} 

Mis preguntas son específicamente:

  1. sería

    Según this question, no van parserObject fuera del alcance cada iteración ya que la palabra clave new no se usa? Evidentemente este código ha estado funcionando.

  2. En este caso, si coloca el objeto en un vector, mantenga el parserObject en el alcance?

  3. De acuerdo con this question, se copia el objeto parserObject. Si este es el caso, ¿cuáles son las implicaciones de rendimiento (por ejemplo, consumo de memoria, asignación de memoria, etc.) de esto? Además, ¿los objetos ParserObjects copiados asumen el mismo alcance que el vector?

Gracias por cualquier ayuda.

+3

Esto es algo básico C++. Recomiendo tomar un [buen libro introductorio de C++] (http://tinyurl.com/so-cxxbooks) y aprender de él.Dicho esto, necesita darse cuenta de una gran diferencia entre C++ y C#: en C++, las variables contienen * valores * (a menos que explícitamente se declaren como referencias, por supuesto), mientras que en C#, la mayoría de las variables contienen * referencias * (por supuesto, sin contar tipos de valor). –

+0

Con 'MyParserObject parserObject;', el programa administra automáticamente la memoria; piense en ello como 'delete parserObject;' justo después del 'for'-loop, aunque esto no necesariamente ocurre en la práctica. –

+0

@ R.Martinho Gracias por la referencia ... y la nota. – bporter

Respuesta

7
  1. Sí, la instancia de parserObject que se declara dentro del bucle for sale del ámbito cada vez que se repite el bucle.

  2. No, colocando el parserObject en el vector no mantiene ese objeto en el alcance. El método push_back() hará una copia de ese objeto que ahora es propiedad de vector. Debe asegurarse de que sus objetos puedan copiarse correctamente (pueden ser necesarios el constructor de copias y el operador de asignación). Las copias contenidas en el vector en este ejemplo son propiedad del vector y tendrán vidas útiles similares a las del vector.

  3. Se copia el paserObject, y esto puede tener implicaciones en el uso y el rendimiento de la memoria. Si el parserObject no es trivial para copiar, puede ser una operación costosa. Esto es totalmente dependiente de su implementación del parserObject.

+0

Dos buenas respuestas y desearía poder aceptar ambas; Sin embargo, al ser obligado a elegir, este respondió explícitamente las preguntas. Gracias a todos por la ayuda. – bporter

4
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope? 

push_back realiza una copia del objeto y lo almacena.

Así que asegúrese de que usted ha definido constructor de copia (y copia-asignación) adecuadamente para la clase MyParserObject si tiene puntero miembro (s). O bien, el código predeterminado generado por el compilador sería suficiente, siempre que cada miembro de MyParserObject siga el mismo patrón (es decir, hayan definido correctamente el copiador-constructor (y la copia-asignación) si tienen miembros de puntero o código predeterminado generado por el compilador sería suficiente, siempre .... y así sucesivamente.)

+0

¿Esto significaría que cada objeto del analizador copiado permanecería en el alcance siempre que MyVectorOfObjects estuviera dentro del alcance? – bporter

+0

@bporter. Sí .... – Nawaz

+1

Si está trabajando con C++ 0x, asegúrese también de definir move-constructor y move-operators. –

Cuestiones relacionadas